我想写一个正则表达式来匹配一组单词(提供/给我一份工作。),该单词在25个字符以内没有另一组单词(没有,不会,等等)。同一句话。我或多或少了解如何获得这组单词,但是我无法弄清楚为什么负向后看在这里不起作用。另外,我只需要在一个正则表达式中完成此操作,并且我正在使用python进行测试。以下是一些匹配/不匹配示例:
Match:
he offered me a job
she gave me a job
Does not match:
he did not even offer me a job
she would not give me a job
he did not think about offering me a job
到目前为止是我的正则表达式:(?<!did not)[^\.\n]{0,25}(?:(?:offer(ed|ing|s)?|g[ai]ves?)[^\.\n\!\?]{0,25}(?:job))
我假设问题是匹配字符串"ab"
或"cd"
,但前提是字符串"ef"
或"gh"
的开头不少于10个字符。
我必须对字符串的结构进行假设:如果"ef"
或"gh"
在"ab"
或"cd"
之前,而后者在"ef"
或"gh"
之前,则后跟[ C0]或"ab"
。
这里是可以使用的正则表达式,只要正则表达式引擎支持负前瞻性。我已经使用PCRE引擎对其进行了测试。
"cd"
(?:ef|gh).{0,9}(?:ab|cd)(?!.*(?:ab|cd))|(ab|cd)(?!.*(?:ab|cd))
我雇用了被称为Demo的人。
注意正则表达式的格式为"the greatest regex trick ever"。如果X|(Y)
匹配,则捕获组1为空。如果X
不匹配,捕获组1将包含字符串X
或"ab"
的行中的最后一个实例。
"cd"
是一个表达式,如果匹配,表示没有字符串X
或"ab"
在字符串"cd"
或"cd"
之后至少有10个字符。
因此,我们忽略匹配的对象,仅检查捕获组1。如果为空,则目标失败;如果为非空,则目标成功,目标是找到字符串"ef"
或"ab"
的last
"cd"
或"cd"
开头或在last之后"ef"
或"cd"
前至少10个字符。正则表达式引擎执行以下操作。
,"ef"
负向前瞻
(?:ef|gh) # match 'ef' or 'gh'
.{0,9} # match 0-9 characters
(?:ab|cd) # match 'ab' or 'cd'
(?! # begin a negative lookahead
.* # match 0+ characters
(?:ab|cd) # match 'ab' or 'cd'
) # end negative lookahead
| # or
(ab|cd) # match 'ab' or 'cd'
(?!.*(?:ab|cd)) # match is to not be followed later in the line by 'ab' or 'cd'
,出现两次,确保(?!.*(?:ab|cd))
或"ab"
的前一个匹配项(如果有)是该行中任一字符串的最后一个实例。通常,如果要匹配多行字符串,则需要进行一些小的更改。我已经编写了正则表达式以在行中匹配,因此我可以在链接的在线正则表达式测试器上演示正则表达式对多个字符串的影响。