使用以下文本节点值...
MatcH one MatcHer two MarcH three
如何使用java matcher.find()创建以下输出?
<wrap>MatcH</wrap> one MatcHer two <wrap>MarcH</wrap> three
假设一个java正则表达式捕获以大写'M'开头并以大写'H'结尾的所有单词
\bM\w*H\b
基本上,我想用 wrap 标签包围与此正则表达式匹配的任何内容
String text = "MatcH one MatcHer two MarcH three";
Pattern pattern = Pattern.compile(\\bM\w*H\b\);
Matcher matcher = pattern.matcher(text);
// replace each time the regex is found
while (matcher.find()) {
text = text.replaceAll(matcher.group(), "<wrap>" +
+ matcher.group() + "</wrap>");
}
ReplaceFirst / ReplaceAll对我不起作用,因为它会产生以下结果......
<wrap>MatcH</wrap> one <wrap>MatcH</wrap>er two <wrap>MarcH</wrap> three
提前致谢...
答案 0 :(得分:2)
您的正则表达式存在问题,因为您执行了replaceAll
,因此它将匹配MatcH
,然后MatcH
和MatcHer
将在循环的迭代中被替换。请注意,\\b
的输出中未显示group
,因此无法阻止其替换MatcHer
。
你可以在循环中放置一个System.out.println
来打印group
的输出和replaceAll
的输出,看看会发生什么以及为什么会这样做。
将您的代码简化为以下内容将起作用:(这可能是“硬编码匹配数字”,但我并没有真正看到它的问题,因为它代表了,我没有看到更简单的解决方案)
String text = "MatcH one MatcHer two MarcH three";
text = text.replaceAll("\\b(M\\w*H)\\b", "<wrap>$1</wrap>");
以上是正则表达式应该如何工作。如果您发现将来可能会出现与上述类似的问题,那么正则表达式可能就不是了。