2

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

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

基本上,我想用包装标签包围任何与这个正则表达式匹配的东西

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

提前致谢...

4

1 回答 1

3

你的正则表达式是有问题的,因为你的 do replaceAll,所以它会 match 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>");

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

于 2013-04-16T21:35:19.210 回答