如何正确使用字符否定 [^ ] 来做单词非固定宽度向后回顾?
How to properly use char negation [^ ] to do word non-fixed width backward lookbehind?
我正在尝试匹配所有 Python 带有左括号的源代码行,但它不是函数定义。基本上,匹配所有函数调用,但不匹配函数定义。
我正在解析 Python 源代码,但我只有 PCRE 引擎,而不是具有非固定宽度后视的新 Javascript。如果句子在匹配之前的任何地方 (.*
) 前面有单词 def
,我将尝试不匹配。
这个正则表达式做了一半:
(?:^)(?:[^d][^e][^f])+\(
它不应匹配具有以下内容的行:(不匹配以 def 开头的左括号)
anything def anything(thing)
anyyything def anythinggg(thing)
并且只匹配以下行:(匹配前面除了 def 以外的任何内容的左括号)
anything anything(thing)
anyyything anythinggg(thing)
但是它有一个问题,就像我做的那样 (?:[^d][^e][^f])+
,只有当左括号 (
前面有一个长度为 3 的倍数的句子时,该表达式才有效:
在 PCRE 中,您不能使用可变长度后视,但可以使用 (*SKIP)(*FAIL)
动词使匹配失败:
def[^(]*\((*SKIP)(*F)|\(
(*FAIL)
表现得像一个失败的否定断言,是 (?!)
的同义词
(*SKIP)
定义一个点,当子模式稍后失败时,正则表达式引擎不允许回溯超过该点
(*SKIP)(*FAIL)
一起提供了一个很好的限制替代方案,你不能在上面的正则表达式中有可变长度的回顾。
It should not match lines with: (not match an open parenthesis preceded by def)
您可以在每行的 ^
开头使用否定 lookahead 断言来检查您的条件:
^(?![^\n(]*?def)[^\n(]*\(
negated class [^\n(]
匹配除换行符和左括号外的任何字符
要从匹配中丢弃 (
之前的部分,请使用 \K
for reset: ^(?![^\n(]*?def)[^\n(]*+\K\(
如果需要将子字符串匹配为 word
,请在 def
的 start/end 处使用 word boundaries \b
我正在尝试匹配所有 Python 带有左括号的源代码行,但它不是函数定义。基本上,匹配所有函数调用,但不匹配函数定义。
我正在解析 Python 源代码,但我只有 PCRE 引擎,而不是具有非固定宽度后视的新 Javascript。如果句子在匹配之前的任何地方 (.*
) 前面有单词 def
,我将尝试不匹配。
这个正则表达式做了一半:
(?:^)(?:[^d][^e][^f])+\(
它不应匹配具有以下内容的行:(不匹配以 def 开头的左括号)
anything def anything(thing)
anyyything def anythinggg(thing)
并且只匹配以下行:(匹配前面除了 def 以外的任何内容的左括号)
anything anything(thing)
anyyything anythinggg(thing)
但是它有一个问题,就像我做的那样 (?:[^d][^e][^f])+
,只有当左括号 (
前面有一个长度为 3 的倍数的句子时,该表达式才有效:
在 PCRE 中,您不能使用可变长度后视,但可以使用 (*SKIP)(*FAIL)
动词使匹配失败:
def[^(]*\((*SKIP)(*F)|\(
(*FAIL)
表现得像一个失败的否定断言,是(?!)
的同义词
(*SKIP)
定义一个点,当子模式稍后失败时,正则表达式引擎不允许回溯超过该点(*SKIP)(*FAIL)
一起提供了一个很好的限制替代方案,你不能在上面的正则表达式中有可变长度的回顾。
It should not match lines with: (not match an open parenthesis preceded by def)
您可以在每行的 ^
开头使用否定 lookahead 断言来检查您的条件:
^(?![^\n(]*?def)[^\n(]*\(
negated class
[^\n(]
匹配除换行符和左括号外的任何字符要从匹配中丢弃
(
之前的部分,请使用\K
for reset:^(?![^\n(]*?def)[^\n(]*+\K\(
如果需要将子字符串匹配为 word
,请在
def
的 start/end 处使用 word boundaries \b