REGEX 贪婪或语法错误

REGEX greediness or just wrong syntax

我试图从文本中的引号中删除所有 [.!?] 并这样做,我想首先用正则表达式捕获我所有的引号,包括 [.!?] 然后删除它们。

我的正则表达式不起作用,可能是因为它太贪心了。它从我的“«”(索引 569 处的字符)到最后一个字符,即另一个“»”(索引 2730 处的字符)。

我的正则表达式是:

Pattern full=Pattern.compile("«.*[.!?].*?»");

Matcher mFull = full.matcher(result);
while(mFull.find()){
    System.out.println(mFull.start()+"  "+mFull.end());
}

所以我得到了:

569   2731

此外,同样的贪婪问题,带有捕捉句子(以任何 [A-Z] 开头并以任何 [.!?] 结尾。

您可以使用

s = s.replaceAll("(\G(?!^)|«)([^«».!?]*)[.!?](?=[^«»]*»)", "");

regex demo

详情

  • (\G(?!^)|«) - 第 1 组(其值由替换模式中的 </code> 引用):上一场比赛结束或 <code>«
  • ([^«».!?]*) - 第 2 组 (</code>):除 <code>«»!. 以外的任何 0+ 个字符和 ?
  • [.!?] - 三个符号中的任何一个
  • (?=[^«»]*») - 除了 «» 之外的 0 个或更多字符后必须有一个 » 紧靠当前位置的右侧。