正则表达式积极前瞻

时间:2012-03-07 11:48:04

标签: regex perl posix regex-lookarounds

为什么这个积极的前瞻与粗体文字不匹配? (不是。而不是 - >)

[_a-z0-9]+(?=\.|->)[_a-z0-9]+
提示6 ai_flags = 0; // comment hints.ai_flags
  提示6 ai_family = AF_UNSPEC;
  int newsocket = socket(结果 - &gt; ai_family 结果 - &gt; ai_socktype 结果< / b> - &GT;的 ai_protocol 的);

1 个答案:

答案 0 :(得分:5)

首先,你需要逃避..匹配'任何',你希望\.匹配“。”)[很奇怪 - 有人编辑了问题来解决这个问题]

第二,向前看前瞻 - 它不会消耗任何东西。所以,即使你逃避.[_a-z0-9]+(?=\.|->)只是消费“hints6”(然后,展望未来,确认 next 字符将会 ”。”)。之后,[_a-z0-9]+无法匹配“。”。

我真的不明白你想要做什么。据我所知,[_a-z0-9]+(?:\.|->)[_a-z0-9]+会做你想要的,没有任何前瞻((?:...)是一个不与结果绑定的分组。)

一般来说,你不需要前瞻,因为你可以匹配。它主要用于你想要匹配一个组时,但是由于某些(奇怪的)原因需要事先检查一个特定的情况。

[edit:]如果您只想捕获这两个单词,请使用([_a-z0-9]+)(?:\.|->)([_a-z0-9]+)(注意这将捕获两个组,每个单词一个)。

[edit2:]如果这是一个语法荧光笔,那么我认为你可以选择突出 字的东西。展示比解释更容易:

(?:[_a-z0-9]+(?=(?:\.|->)[_a-z0-9]+)|(?<=[_a-z0-9]+(?:\.|->))[_a-z0-9]+)

将突出显示“一个单词后跟.word”或“一个单词前面的单词。”,它会突出显示两个单词而不突出显示该单词。它们是两个独立的匹配,但语法高亮显示不关心(我假设)。