Java正则表达式replaceAll抛出ArrayIndexOutOfBoundsException

Java正则表达式replaceAll抛出ArrayIndexOutOfBoundsException,java,regex,Java,Regex,我试图用Java将HTML中的一个单词用一些标记包围起来。调用replaceAll时,此代码抛出一个ArrayIndexOutOfBoundsException Pattern pattern = Pattern.compile(wordToHighlight + "\\w{0,5}"); String replacement = "<span class='highlight'>$1</span>"; Matcher matcher = pattern.matcher(

我试图用Java将HTML中的一个单词用一些标记包围起来。调用replaceAll时,此代码抛出一个ArrayIndexOutOfBoundsException

Pattern pattern = Pattern.compile(wordToHighlight + "\\w{0,5}");
String replacement = "<span class='highlight'>$1</span>";
Matcher matcher = pattern.matcher(html);

if (matcher != null)
    if (matcher.find())
        retVal = matcher.replaceAll(replacement);
Pattern=Pattern.compile(wordToHighlight+“\\w{0,5}”);
字符串替换=“$1”;
Matcher Matcher=pattern.Matcher(html);
如果(匹配器!=null)
if(matcher.find())
retVal=matcher.replaceAll(替换);

我不熟悉Java中的正则表达式,所以我将继续猜测,如果我有点偏离基准,请原谅。在PCRE(PHP)中,$1表示第一个捕获组,因为您没有可能抛出错误的捕获组。尝试使用$0。

您应该尝试在搜索表达式中添加捕获组。i、 e.将字符串用括号括起来

i、 e

尝试四个反斜杠:

Pattern.compile(wordToHighlight+“\\w{0,5}”)

不知怎的,逃跑发生了两次。这意味着:

1。)\\变成\


2.)然后变成\

在那一点上
html
包含什么?谁在乎呢?这是在任意HTML字符串中突出显示搜索文本的一种过于简单的尝试。这有无数种可能出错的方式,但在大多数情况下都会起作用。如果用户在搜索表达式中包含尖括号,则可以享受有趣的效果。仅供参考,代码中的
if(matcher!=null)
if(matcher.find())
都没有做任何有用的事情。如果代码到达该点,
matcher
不能为
null
(它会引发异常),那么
replaceAll()
要做的第一件事就是调用
find()
。如果返回
false
它只返回原始字符串。现在该死的编辑器逃逸了我的答案。第二次尝试:1。)\ \变成\\\\then 2。)\\\\变成\\现在编辑器没有逃逸我的答案。第三次尝试:1。)\\\\变成\\\\then 2。)\\\变成\\\\then是!!!!现在没事了!!!!
"(" + wordToHighlight + "\\w{0,5})"