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:
^(?!.*//)/.*
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.