1

为什么这种积极的前瞻与粗体文本不匹配?(不是 . 也不是 ->)

[_a-z0-9]+(?=\.|->)[_a-z0-9]+
提示6ai_flags = 0; // 注释hints.ai_flags
hints6 . ai_family = AF_UNSPEC;
int newsocket = socket(结果-> ai_family结果-> ai_socktype结果-> ai_protocol);
4

1 回答 1

5

首先,您需要转义.(.匹配 'anything',您想\.匹配 ".") [奇怪 - 有人编辑了问题以解决该问题]

其次,向前看——它不消耗任何东西。因此,即使您转义.,[_a-z0-9]+(?=\.|->)也只会消耗“hints6”(然后向前看,确认下一个字符将是“.”)。之后,[_a-z0-9]+无法匹配“。”。

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

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

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

[edit2:] 如果这是用于语法荧光笔,那么我认为您可以使用可以突出显示一单词的东西。展示比解释容易:

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

这将突出显示“一个单词后跟.word”或“一个单词前面有单词。”,这将突出显示两个单词而不突出显示点。它们是两个单独的匹配项,但语法荧光笔并不关心(我假设)。

于 2012-03-07T11:54:15.587 回答