【问题标题】:Regex multiple lookbehinds order正则表达式多个后视顺序
【发布时间】:2020-12-24 10:31:42
【问题描述】:

我有一个正则表达式,如果没有任何后续单词字符,我想用它来匹配 - 之后的单词字符。

(?<!\w)(?<=-)\w+

对于字符串

I want -to match a word-if it has a '-' bofore it and only-if '-' is not preceded by a word character.

我希望它只匹配to。但是,它实际上匹配toifif

Demo

如果我采取积极的向后看

(?<!\w)-\w+

在同一个字符串中,它只按预期匹配-to,但我不希望匹配信息中出现-

是否可以将正面和负面的后视链接起来,以便它们按顺序发生?

【问题讨论】:

  • 也许只使用\W-(\w+) 并获取第一组?并且(?:\W|^)-(\w+) 也将匹配字符串的开头。

标签: regex


【解决方案1】:

您尝试的模式(?&lt;!\w)(?&lt;=-)\w+ 使 2 个断言成为当前位置:

  • (?&lt;!\w)左边是不是直接有单词字符
  • (?&lt;=-) 左边有没有-

这也可以写成(?&lt;=-)\w+,因为正向后视断言完全匹配应该在左边。

您会得到匹配的 toifif,因为该断言在多个地方都是正确的。


您可以使用(?&lt;=\W-) 来断言直接在左边的是一个非单词字符\W 后跟-

(?<=\W-)\w+

Regex demo

【讨论】:

  • 谢谢你,它似乎运作良好。如果它们位于 -I want -to match a word-if it has a '-' bofore it and only-if '-' is not preceded by a word character. 的开头,Ito 都将匹配,有什么方法可以让它匹配单词字符。 Demo
  • @Dan 然后一个选项是使用 2 (?:(?&lt;=\W-)|(?&lt;=^-))\w+lookbehinds regex101.com/r/DF22Pt/1
  • 再次感谢大家的帮助
  • @Dan 一些引擎也支持(?&lt;=(?:\W|^)-)\w+regex101.com/r/SiiBcF/1
【解决方案2】:

使用

(?<=\B-)\w+

proof

说明

--------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    \B                       the boundary between two word chars (\w)
                             or two non-word chars (\W)
--------------------------------------------------------------------------------
    -                        '-'
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                           more times (matching the most amount
                           possible))

【讨论】:

  • 感谢您的回答。打算让另一个打勾,但两者都有效:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多