在正则表达式中动态跳过部分

时间:2015-04-12 21:19:52

标签: regex lazy-evaluation parentheses regex-greedy

我正在尝试开发一个与句子中第一个句点匹配的正则表达式 - 只要该句号不在任何括号内。

所以,例如,字符串:

  汤姆(爱德华)去了店主(J. Guys,A。所有者和B. Ains)聚集的商店。这是一个美好的夜晚。

应该返回:

  汤姆(Ed。)去了店主(J. Guys,A。所有者和B. Ains)聚集的商店。

然而,我发现使用懒惰的方法,我只得到:

  汤姆(Ed。

而且,使用贪婪的方法,显然我得到了整个句子。并非所有句子都是这样构造的(例如,有些句子没有括号),我尝试使用否定查找,但我并不特别理解它。

任何人都知道如何继续?

2 个答案:

答案 0 :(得分:1)

您可以在Java中使用此正则表达式来匹配不在圆括号内的句点:

(?=([^(]*\([^)]*")*[^)]*$)\.

要匹配整个Tom (Ed.) went down to the shop where the owners (J. Guys, A. Owner, and B. Ains) gathered.句子,您可以使用

.*?(?=([^(]*\([^)]*")*[^)]*$)\.

看看demo。此外,在Java中,您将不得不双重转义斜杠:

 String pattern = ".*?(?=([^(]*\\([^)]*")*[^)]*$)\\.";

答案 1 :(得分:0)

您可以使用以下内容:

[^().]*\([^)]*\)[^().]*

Demo

此模式包含3部分:

2部分[^().]*将匹配除()和点

之外的任何字符串的任何长度

\([^)]*\)将括号与内容匹配。