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])$
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])$
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 stringSee a regex demo
You can use
^(?:/[^/?&#\s]+)*/?$
See the regex demo.
Details
^ - start of string(?:/[^/?&#\s]+)* - zero or more repetitions of a / char followed with one or more chars other than /, ?, &, # and whitespace/? - an optional /$ - end of string.