REGEX贪婪或语法错误

时间:2019-05-22 09:08:08

标签: java regex regex-greedy

我试图删除文本引号中的所有[.!?],因此,我想首先用正则表达式捕获所有包含[.!?]的引号,然后再将其删除。

我的正则表达式不起作用,可能是因为它很贪婪。从我的“«”(索引号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]开头并以任何[。!?]结尾。

1 个答案:

答案 0 :(得分:1)

您可以使用

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

请参见regex demo

详细信息

  • (\G(?!^)|«)-第1组(其值在替换模式中用$1引用):上一场比赛的结束或«
  • ([^«».!?]*)-第2组($2):除«»!.和{ {1}}
  • ?-三个符号中的任何一个
  • [.!?]-当前位置右边的(?=[^«»]*»)»之外的0个或多个字符之后必须有一个«