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

时间:2017-08-17 02:30:48

标签: regex

我有这个正则表达式,它扫描文本中的单词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个实例,但我只对匹配第一个实例感兴趣而忽略整个史密斯引用。

2 个答案:

答案 0 :(得分:0)

你所描述的是用正则表达式来处理的有点棘手。很难确定你是否在报价范围内。你的第二个正则表达式无效,因为它只忽略直接在引用右边的第一个Pattern pattern = Pattern.compile("[“”]"); String text = "“METRO Blue Line” “Target Field Station Platform 1” “south” "; String arr[] = text.split("\\”"); for (int i = 0; i < arr.length; i++) { System.out.println(pattern.matcher(arr[i]).replaceAll("").trim()); } ,并且仍然匹配第二个正则数。

this answer中汲取灵感,然后又引用另一个答案来描述如何regex match a pattern unless ...我可以捕捉到你想要的匹配。

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

|

我们匹配第一个子句中的引用字符串,但我们不会在一个组中捕获它们,然后我们匹配(并捕获)第二个子句中的单词"[^"]*"|(very) 。您可以在捕获的组中找到此匹配项。如何引用捕获的组取决于您的正则表达式环境。

有关测试用例,请参阅此regex101 fiddle

答案 1 :(得分:0)

这个正则表达式

(?i)(?<!(((?<DELIMITER>[ \t\r\n\v\f]+)(")(?<FILLER>((?!").)*))))\bvery\b(?!(((?<FILLER2>((?!").)*)(")(?<DELIMITER2>[ \t\r\n\v\f]+))))

可以在两种情况下工作:

  • 你的正则表达式引擎允许无限制的背后隐藏
  • 引号由空格分隔

http://regexstorm.net/tester

上试用