复杂的正则表达式以匹配不在引号内的任何内容



我有这个正则表达式,它可以扫描文本以查找单词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.在这一点中,我们有 3 个very实例,但我只对匹配第一个实例感兴趣,而忽略整个史密斯报价。

你描述的内容用正则表达式处理起来有点棘手。很难确定您是否在报价内。您的第二个正则表达式无效,因为它仅忽略直接位于引号右侧的第一个very,并且仍然与第二个正则表达式匹配。

从这个答案中汲取灵感,这反过来又引用了另一个描述如何正则表达式匹配模式的答案,除非......我可以捕捉你想要的比赛。

基本思想是使用交替|并匹配所有您不想要的内容,然后最终匹配(并捕获(您在最终子句中想要的内容。像这样:

"[^"]*"|(very)

我们在第一个子句中匹配带引号的字符串,但不在一个组中捕获它们,然后我们匹配(并捕获(第二个子句中的单词very。您可以在捕获的组中找到此匹配项。引用捕获的组的方式取决于您的正则表达式环境。

有关测试用例,请参阅此正则表达式101小提琴。

这个正则表达式

(?i)(?<!(((?<DELIMITER>[ trnvf]+)(")(?<FILLER>((?!").)*))))bveryb(?!(((?<FILLER2>((?!").)*)(")(?<DELIMITER2>[ trnvf]+))))

可以在两种条件下工作:

  • 您的正则表达式引擎允许无限回溯
  • 引号由空格分隔

试穿 http://regexstorm.net/tester

最新更新