复杂的正则表达式匹配任何不在引号
我有这个正则表达式可以扫描文字very
:(?i)(?:^|\W)(very)[\W$]
它的工作原理。我的目标是升级它,并避免在引用中单独或作为较长块的一部分进行匹配。复杂的正则表达式匹配任何不在引号
现在,我有这个其他正则表达式匹配任何不在里面的引号:(?<![\S"])([^"]+)(?![\S"])
这也适用。
我的问题是,我似乎无法将它们结合起来。例如字符串:
Fred Smith very loudly said yesterday at a press conference that fresh peas will "very, very defintely not" be served at the upcoming county fair
。在这一点上,我们有very
3个实例,但我只对匹配第一个和忽略整个史密斯报价感兴趣。
你所描述的是用正则表达式处理棘手的问题。很难确定你是否在报价单内。你的第二个正则表达式是无效的,因为它只忽略了直接在引用右边的第一个very
,并且仍然匹配第二个正则表达式。
从this answer吸取灵感,依次引用另一个描述如何regex match a pattern unless ...我可以捕捉你想要的匹配的答案。
基本思想是使用替代|
并匹配所有你不想要的东西,然后最后匹配(并捕获)你在最后一个子句中要做的事情。事情是这样的:
"[^"]*"|(very)
我们匹配引述第一条中的字符串,但我们并不第二子句中捕捉它们放在一个组,然后我们匹配(和捕获)字very
。您可以在捕获的组中找到该匹配项。您如何引用捕获的组取决于您的正则表达式环境。
对于测试用例,请参阅此regex101 fiddle。
我看到里面的单词仍然被匹配。我需要忽略那里的任何东西。 –
这种方法的工作方式是捕获组。你主动匹配引用的字符串,但你没有捕获它(没有捕获组),你只使用捕获组来“非常”,然后你可以引用它。引用捕获组取决于你的正则表达式环境,但我不确定你在使用什么。 – Matt
此正则表达式
(?i)(?<!(((?<DELIMITER>[ \t\r\n\v\f]+)(")(?<FILLER>((?!").)*))))\bvery\b(?!(((?<FILLER2>((?!").)*)(")(?<DELIMITER2>[ \t\r\n\v\f]+))))
可在两个条件下工作:
- 你的正则表达式引擎允许无限回顾后
- 引号用空格分隔
设置它的赏金。我希望看到如何匹配一个字符串,该字符串不会在奇数引号之后和至少一个引号之前出现。 – Aydin4ik