如果有3个或更多次出现,我需要替换最后一个斜杠。如果我们有这样的路径"/foo/bar/"
,它应该变为"/foo/bar"
。但是不应该触及像"/foo/"
这样的路径。
我尝试使用转义斜杠(\/
)和量词({3,}
):
/\/{3,}$/
但是,此正则表达式仅匹配直接在另一个之后的斜杠:"/foo/bar///"
我有什么想法可以解决这个问题?也许使用正面/负面lookahead
?
要想象:
"/foo/" => "/foo/"
"/foo/bar/" => "/foo/bar"
"/foo/bar/baz/" => "/foo/bar/baz"
感谢Fede,Avinash Raj& Amal Murali!由于性能很重要,@ Fede是赢家:http://jsperf.com/match-last-slash-if-there-are-at-least-nth-occurrences
答案 0 :(得分:2)
您可以使用以下正则表达式:
\/.*?\/.*(\/)
这里有一个工作示例:
http://regex101.com/r/xT3pN1/2
如果你想保留除最后一个斜杠之外的内容,你可以使用这个正则表达式并引用第一个组作为\1
:
(\/.*?\/.*)(\/)
使用替换检查工作示例:
答案 1 :(得分:1)
您可以使用以下正则表达式,前瞻性:
^(?=.*(?:.*?\/){3,})(.*)\/$/m
说明:
^ # Assert position at the beginning of the line
(?= # Positive lookahead: if followed by
.* # Match any number of characters
(?: # Begin non-capturing group
.*?\/ # Match any number of characters followed by a '/'
) # End of group
{3,} # Repeat the group 3 or more times
) # End of lookahead
(.*) # Match (and capture) any number of characters
\/ # Match a literal backslash
$ # Assert position at the end of the line
然后将其替换为\1
。
答案 2 :(得分:1)