我有这个正则表达式,它扫描文本中的单词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
个实例,但我只对匹配第一个实例感兴趣而忽略整个史密斯引用。
答案 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]+))))
可以在两种情况下工作: