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.
