忽略正则表达式中字符的最后出现?

问题描述 投票:1回答:2

我有一个正则表达式,看起来像/([A-z0-9]+\-)+/g。它与test-string-中的模式test-string-5RtA相匹配。如何忽略该匹配项中的最后一个-字符(但仅最后一个)。我尝试使用积极的前瞻,但这似乎无济于事。如何修改正则表达式以排除最后一个-字符? Here是查看正在使用的正则表达式的链接。

regex pcre
2个回答
2
投票

如果正确使用,前瞻应该可以正常工作。尝试这样的事情:

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

因为+greedy,所以它将尽可能匹配-个字符(由于前瞻,最后一个除外)。

Demo

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


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

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

Demo


0
投票

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

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

PCRE Demo

似乎不需要捕获小组。

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

© www.soinside.com 2019 - 2024. All rights reserved.