【问题标题】:Regex throws exception index out of range for unicode char?正则表达式抛出异常索引超出 unicode char 的范围?
【发布时间】:2014-03-27 03:36:31
【问题描述】:

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

DEMO

一切正常!

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

文字[23]55357
文字[24]56561

如下所示:Text String Value

String text = "Hi\n\nyo keep this here\n\n????Unicode 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 字符,它就可以正常工作。

【问题讨论】:

    标签: java regex unicode


    【解决方案1】:

    你应该这样使用。

    作为 This should be deleted 在您的字符串中应该真正意味着

    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。

    【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 2013-04-22
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多