正则表达式引发异常索引超出范围的unicode char?

时间:2014-03-27 03:36:31

标签: java regex unicode

我有一个正则表达式,它基本上将所有绿色文本保持在特定模式之上(保存group1)。

DEMO

这一切都在发挥作用!

现在,如果在解析每个java时有unicode字符。下面的m.find()抛出超出范围-2的异常索引。有问题的两个字符是:

  

文本[23] 55357个
  文本[24] 56561

如下所示:Text String Value

String text = "Hi\n\nyo keep this here\n\nUnicode b4 here\n\nyo\ncut me:\n\nThis should be deleted";
System.out.println(text);
Pattern PATTERN = Pattern.compile("^(.+?)\\byo\\b(?:(?!cut me:|yo).)*cut me:",  Pattern.DOTALL);
Matcher m = PATTERN.matcher(text);
if (m.find()) {
    text = m.group(1);
    System.out.println(text);
}

所以,我的问题是为什么会抛出这个?

我已尝试在字符串上使用javaescape(apache utils)并且它可以防止抛出,但是如果我逃避它,我的正则表达式找不到匹配。

当然,如果删除unicode字符,它可以正常工作。

1 个答案:

答案 0 :(得分:1)

你应该这样使用。

作为这应该删除在你的字符串中应该真正意味着

Pattern PATTERN = Pattern.compile("^(.+?)\\nyo\\n(?:(?!cut me:|yo).)*cut me:",  Pattern.DOTALL);
  

为什么会抛出异常?

StringIndexOutOfBound异常(根据Oracle文档)

  

按String方法抛出,以指示索引为负数   或者大于字符串的大小。

在您的情况下,当您尝试使用m.find()尝试查找与模式匹配的输入序列的下一个子序列时,会抛出它。

正如您尝试使用\b

时所看到的那样
System.out.println(m.groupCount());

这将返回0.