首页 > 解决方案 > 正则表达式贪婪或语法错误

问题描述

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

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

我的正则表达式是:

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

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

所以我得到了:

569   2731

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

标签: javaregexregex-greedy

解决方案


您可以使用

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

查看正则表达式演示

细节

  • (\G(?!^)|«)- 第 1 组(其值$1从替换模式中引用):前一个匹配的结束或«
  • ([^«».!?]*)- 第 2 组 ( ):除、、和之外的$2任何 0+ 个字符«»!.?
  • [.!?]- 三个符号中的任何一个
  • (?=[^«»]*»)- 除了当前位置的右侧之外,必须有»0 个或多个字符之后。«»

推荐阅读