我试图删除文本中所有引号中的[.!?]
,这样做是,我想首先用正则表达式捕获所有包含[.!?]
的引号,然后再将其删除。
我的正则表达式不起作用,可能是因为它很贪婪。它从我的“«”(索引号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/