【问题标题】:Java RegEx replaceAll throws ArrayIndexOutOfBoundsException [duplicate]Java RegEx replaceAll 抛出 ArrayIndexOutOfBoundsException [重复]
【发布时间】:2011-03-22 19:52:27
【问题描述】:

我正在尝试在 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);

【问题讨论】:

  • 此时html 包含什么?
  • 谁在乎?这是在任意 HTML 字符串中突出显示搜索文本的简单尝试。有无数种方法可能会出错,但在大多数情况下都会起作用。如果用户在搜索表达式中包含尖括号,他们可以享受有趣的效果。
  • 仅供参考,您的代码中的if (matcher != null) 和if (matcher.find()) 都没有做任何有用的事情。如果代码到达那个点matcher不能是null(它会抛出一个异常),那么replaceAll()做的第一件事就是调用find()。如果返回 false 它只返回原始字符串。

标签: java regex


【解决方案1】:

我对 Java 中的 Regex 不熟悉,所以我将继续进行猜测,如果我偏离基础,请原谅。在 PCRE (PHP) 中,$1 指的是第一个捕获组,因为您没有可能引发错误的捕获组。尝试使用 $0。

【讨论】:

    【解决方案2】:

    您应该尝试在搜索表达式中放置一个捕获组。即将你的字符串用括号括起来。

    即

    "(" + wordToHighlight + "\\w{0,5})"
    

    【讨论】:

      【解决方案3】:

      尝试四个反斜杠:

      Pattern.compile(wordToHighlight + "\\w{0,5}");

      不知何故,转义发生了两次。这意味着:

      1.) \\ 变成 \

      2.) 然后\变成\

      【讨论】:

      • 现在该死的编辑逃脱了我的回答。
      • 第二次尝试:1.) \\\\\\\\ 变成 \\\\ 然后 2.) \\\\ 变成 \\
      • 现在小编没有逃避我的回答。
      • 第三次尝试:1.) \\\\ 变成 \\ 然后 2.) \\ 变成 \
      • 是的!!!!现在好了!!!!
      猜你喜欢
      • 1970-01-01
      • 2020-02-07
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2013-01-16
      • 2016-08-31
      • 2011-02-25
      相关资源
      最近更新 更多