如果至少出现第n次,则匹配最后一次斜杠

时间:2014-07-03 17:11:33

标签: javascript regex quantifiers

如果有3个或更多次出现,我需要替换最后一个斜杠。如果我们有这样的路径"/foo/bar/",它应该变为"/foo/bar"。但是不应该触及像"/foo/"这样的路径。

我尝试使用转义斜杠(\/)和量词({3,}):

/\/{3,}$/

但是,此正则表达式仅匹配直接在另一个之后的斜杠"/foo/bar///"

我有什么想法可以解决这个问题?也许使用正面/负面lookahead

http://www.regexr.com/393pm

要想象:

"/foo/"         => "/foo/"
"/foo/bar/"     => "/foo/bar"
"/foo/bar/baz/" => "/foo/bar/baz"

感谢FedeAvinash Raj& Amal Murali!由于性能很重要,@ Fede是赢家:http://jsperf.com/match-last-slash-if-there-are-at-least-nth-occurrences

3 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式:

\/.*?\/.*(\/)

这里有一个工作示例:

http://regex101.com/r/xT3pN1/2

Regular expression visualization

Debuggex Demo

如果你想保留除最后一个斜杠之外的内容,你可以使用这个正则表达式并引用第一个组作为\1

(\/.*?\/.*)(\/)

使用替换检查工作示例:

http://regex101.com/r/xT3pN1/3

答案 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

Regex101 demo

答案 2 :(得分:1)

这个怎么样?

^((?=\/.*?\/.*?\/).*?)([\/]+)$

使用第一个捕获的组替换所有内容。

DEMO