如何用xml包装(环绕)java匹配器组?

时间:2013-04-16 20:57:37

标签: java regex matcher

使用以下文本节点值...

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

提前致谢...

1 个答案:

答案 0 :(得分:2)

您的正则表达式存在问题,因为您执行了replaceAll,因此它将匹配MatcH,然后MatcHMatcHer将在循环的迭代中被替换。请注意,\\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>");

以上是正则表达式应该如何工作。如果您发现将来可能会出现与上述类似的问题,那么正则表达式可能就不是了。