如何忽略最后一次出现的字符?

How to ignore last occurrence of character?

我有一个如下所示的正则表达式:

/([A-z0-9]+\-)+/g

它匹配 test-string-5RtA 中的模式 test-string-。我怎么能忽略那场比赛中的最后一个 - 字符(但只是最后一个)。我尝试使用积极的前瞻性,但这似乎没有任何作用。如何修改我的正则表达式以排除最后一个 - 字符?

Here 是 link 以查看正则表达式的作用。

如果正确使用 Lookahead,Lookahead 应该可以很好地用于此目的。尝试这样的事情:

^[A-z0-9-]+(?=-)

因为+greedy,它会匹配尽可能多的-个字符(除了最后一个因为Lookahead)。

Demo.

注意:我添加了 ^ 以确保匹配从字符串的开头开始。如果您的字符串可能不是以字母数字字符开头并且您仍然认为它是有效匹配项,则可以将其删除。


如果你想确保 - 总是出现在一个或多个字母数字字符之后(即,没有连续的 -),你可以改用这样的东西:

^(?:[A-z0-9]+-?)+(?=-)

Demo.

您可以使用以下正则表达式来匹配包含指定字符但不以连字符结尾的字符串。

[A-z0-9+\-]+(?<!-)

PCRE Demo

好像不需要捕获组。

(?<!-) 是一个负面回顾。例如,在 [A-z0-9+\-]+ 匹配字符串 "c-at-*" 中的 "c-at-" 之后,正则表达式的内部字符串指针将位于第二个连字符和星号之间。断言前一个字符不能是连字符的否定回顾将失败。然后,正则表达式引擎将回溯一个字符(在 "t""-" 之间),此时负向后视将得到满足,导致 "c-at" 被匹配。