首页 / 正则 / 避免在Java中重叠正则表达式匹配
避免在Java中重叠正则表达式匹配
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了避免在Java中重叠正则表达式匹配,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1972字,纯文字阅读大概需要3分钟。
内容图文
![避免在Java中重叠正则表达式匹配](/upload/InfoBanner/zyjiaocheng/783/1ee0db29061a4292bbbec9b25d2855fb.jpg)
出于某种原因,这段Java代码给了我重叠的匹配:
Pattern pat = Pattern.compile("(" + leftContext + ")" + ".*" + "(" + rightContext + ")", Pattern.DOTALL);
任何方式/选项,以避免检测重叠?例如
leftContext rightContext rightContext
应该是1匹配而不是2匹配
这是完整的代码:
public static String replaceWithContext(String input, String leftContext, String rightContext, String newString){
Pattern pat = Pattern.compile("(" + leftContext + ")" + ".*" + "(" + rightContext + ")", Pattern.DOTALL);
Matcher matcher = pat.matcher(input);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(buffer, "");
buffer.append(matcher.group(1) + newString + matcher.group(2));
}
matcher.appendTail(buffer);
return buffer.toString();
}
所以这是使用否定前瞻的最终答案,我不理解*是贪婪的:
Pattern pat = Pattern.compile("(" +
leftContext + ")" + "(?:(?!" +
rightContext + ").)*" + "(" +
rightContext + ")", Pattern.DOTALL);
解决方法:
您对“重叠”一词的使用令人困惑.显然,你的意思是正则表达式太贪婪,匹配从第一个leftContext到最后一个rightContext的所有内容.看起来你已经知道了 – 并且提出了一个更好的方法 – 但仍然至少存在一个潜在的问题.
你说leftContext和rightContext是“简单字符串”,我假设你认为它们不应该被解释为正则表达式,但它们将是.您需要转义它们,或者它们包含的任何正则表达式元字符都会导致错误的结果或运行时异常.替换字符串也是如此,尽管只有$和反斜杠在那里有特殊意义.这是一个例子(注意非贪婪.*?):
public static String replaceWithContext(String input, String leftContext, String rightContext, String newString){
String lcRegex = Pattern.quote(leftContext);
String rcRegex = Pattern.quote(rightContext);
String replace = Matcher.quoteReplacment(newString);
Pattern pat = Pattern.compile("(" + lcRegex + ").*?(" + rcRegex + ")", Pattern.DOTALL);
另一件事:如果你没有对匹配的文本进行任何匹配后处理,你可以使用replaceAll,而不是使用appendReplacement和appendTail来自己滚动:
return input.replaceAll("(?s)(" + lcRegex + ")" +
"(?:(?!" + rcRegex + ").)*" +
"(" + rcRegex + ")",
"$1" + replace + "$2");
内容总结
以上是互联网集市为您收集整理的避免在Java中重叠正则表达式匹配全部内容,希望文章能够帮你解决避免在Java中重叠正则表达式匹配所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。