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

3

我有一个正则表达式,看起来像这样:

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

它将从“test-string-5RtA”中匹配模式“test-string-”。我该如何忽略该匹配中的最后一个“-”字符(仅限最后一个)?我尝试使用正向先行断言,但似乎没有起作用。我该如何修改我的正则表达式以排除最后一个“-”字符? 这里是查看正则表达式实际效果的链接。

3
你想匹配在字母表中介于大写字母 "Z" 和小写字母 "a" 之间的六个 ASCII 字符:"[", "\\", "]", "^", "_""\"。这似乎有些奇怪 :-) - Cary Swoveland
@CarySwoveland 谢谢你注意到了那个错误。我只是想获取所有的大写和小写字母。我应该指定不区分大小写的标志,并将其更改为A-Z - Alex Lowe
2个回答

2
如果使用得当,前瞻应该可以很好地完成这个目的。尝试像这样做:
^[A-z0-9-]+(?=-)

因为 +贪婪的,它会尽可能地匹配尽量多的 - 字符(除了最后一个,因为有前瞻)。

演示

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


如果您想确保-始终在一个或多个字母数字字符之后(即不连续的-),则可以使用以下内容:
^(?:[A-z0-9]+-?)+(?=-)

This translates to: "

Demo.

"

如果我要忽略连续出现的两个“-”,我应该怎么做? - Alex Lowe
1
@AlexLowe 更新了答案。 - ICloneable
亚历克斯,你说的“忽略”两个连续的破折号是什么意思?你是指允许字符串以两个连续的破折号结尾,但不能以一个(或三个或更多连续的)破折号结尾吗? - Cary Swoveland

1
您可以使用以下正则表达式匹配包含指定字符但不以连字符结尾的字符串。
[A-z0-9+\-]+(?<!-)

PCRE演示

似乎不需要捕获组。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接