为什么这种积极的前瞻与粗体文本不匹配?(不是 . 也不是 ->)
[_a-z0-9]+(?=\.|->)[_a-z0-9]+
提示6。ai_flags = 0; // 注释hints.ai_flags
hints6 . ai_family = AF_UNSPEC;
int newsocket = socket(结果-> ai_family,结果-> ai_socktype,结果-> ai_protocol);
为什么这种积极的前瞻与粗体文本不匹配?(不是 . 也不是 ->)
[_a-z0-9]+(?=\.|->)[_a-z0-9]+
提示6。ai_flags = 0; // 注释hints.ai_flags
hints6 . ai_family = AF_UNSPEC;
int newsocket = socket(结果-> ai_family,结果-> ai_socktype,结果-> ai_protocol);
首先,您需要转义.
(.
匹配 '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”或“一个单词前面有单词。”,这将突出显示两个单词而不突出显示点。它们是两个单独的匹配项,但语法荧光笔并不关心(我假设)。