Home > Software engineering >  Regex to not match more than one trailing slash in string
Regex to not match more than one trailing slash in string

Time:05-27

Looking for a regex to not match more than 1 occurrence of a trailing slash

api/v1
/api/v1
/api/2v1/21/
/api/blah/v1/
/api/ether/v1//
/api/23v1///

Expected match

/api/v1
/api/2v1/21/
/api/blah/v1/

What I tried:

^\/([^?&#\s]*)(^[\/{2,}\s])$

CodePudding user response:

By use of a negative lookahead:

^(?!.*//)/.*

See this demo at regex101

CodePudding user response:

In the pattern that you tried, the second part of the pattern can not match, it asserts the start of the string ^ and then matches a single character in the character class (^[\/{2,}\s])$ directly followed by asserting the end of the string.

^\/([^?&#\s]*)(^[\/{2,}\s])$

              ^^^^^^^^^^^^^^

But you have already asserted the start of the string here ^\/

You can repeat a pattern starting with / followed by repeating 1 times the character class that you already have:

^(?:\/[^\/?&#\s] ) \/?$

Explanation

  • ^ Start of string
  • (?:\/[^\/?&#\s] ) Repeat 1 times / and 1 char other than the listed ones
  • \/? Optional /
  • $ End of string

See a regex demo

CodePudding user response:

You can use

^(\/[^\/] ) \/?$

See the regex demo. I added \n to the negated character class for the matches to stay on the same line since the regex is applied to a single multiline string in the regex fiddle.

Details

  • ^ - start of string
  • (\/[^\/] ) - one or more repetitions of a / char followed with one or more chars other than /
  • \/? - an optional /
  • $ - end of string.
  • Related