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

我的正则表达式不起作用,可能是因为它很贪婪。它从我的“«”(索引号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(?!^)|«)([^«».!?]*)[.!?](?=[^«»]*»)", "$1$2");


请参见regex demo

细节


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

关于java - REGEX贪婪或语法错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56253156/

10-12 01:50