typescript - Vad är regexen för att matcha relativ sökväg utan '../'?


Jag kan inte lista ut regex-mönstret för mitt specifika fall. På ett inmatningsformulär försöker jag validera en URI och vill inte att klienten ska kunna skriva in antingen någon absolut sökväg eller en relativ sökväg om den innehåller '../'.

Jag har ingen aning om varför den här är svår... hittills har jag fått ^([^.{2}/])(?!\.\.\/), men den här upptäcker inte om URI:erna har ett godtyckligt antal '../'-strängar i mitten av dem. Jag provade ^([^.{2}/])(?!(\.\.\/)+) också, men av någon anledning misslyckas URI:erna med '../' i mitten fortfarande.

Mina tester är:

(BAD)
/my/path
../my/path
/my/../path
my/../path
my/../../path
my/../path/../is/bad

(GOOD)
my/path
./my/path
my/./path

Jag uppskattar hjälpen!

Svar #1

Använd

^(?!\/)(?!.*(?:^|\/)\.\.\/).+

Se bevis

FÖRKLARING

--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    \/                       '/'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    (?:                      group, but do not capture:
--------------------------------------------------------------------------------
      ^                        the beginning of the string
--------------------------------------------------------------------------------
     |                        OR
--------------------------------------------------------------------------------
      \/                       '/'
--------------------------------------------------------------------------------
    )                        end of grouping
--------------------------------------------------------------------------------
    \.                       '.'
--------------------------------------------------------------------------------
    \.                       '.'
--------------------------------------------------------------------------------
    \/                       '/'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  .+                       any character except \n (1 or more times
                           (matching the most amount possible))