【问题标题】:How to ignore last occurrence of character?如何忽略最后一次出现的字符?
【发布时间】:2020-05-12 02:27:57
【问题描述】:

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

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

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

Here 是查看正则表达式的链接。

【问题讨论】:

  • 你想匹配"[""\\""]""^""_""`"这六个ASCII字符在@987654333之间似乎很奇怪@ 和 "a"。 :-)
  • @CarySwoveland 感谢您认识到该错误。我试图只获取所有大写和小写字母。我应该只指定不区分大小写的标志并将其更改为A-Z

标签: regex pcre


【解决方案1】:

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

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

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

Demo.

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


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

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

Demo.

【讨论】:

  • 如果我要忽略两个连续的-,我该怎么办?
  • @AlexLowe 更新了答案。
  • Alex,你说的 ignore 两个连续的连字符是什么意思?您的意思是允许字符串以两个连续的连字符结尾,但不能以一个(或三个或更多连续的)连字符结尾?
【解决方案2】:

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

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

PCRE Demo

似乎不需要捕获组。

(?&lt;!-) 是一个消极的后视。例如,在[A-z0-9+\-]+ 与字符串"c-at-*" 中的"c-at-" 匹配后,正则表达式的内部字符串指针将位于第二个连字符和星号之间。断言前一个字符不能是连字符的否定lookbehind 将失败。然后,正则表达式引擎将回溯一个字符(到"t""-" 之间),此时将满足否定的后向查找,从而匹配"c-at"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2012-06-05
    • 2012-03-17
    • 2016-01-08
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多