具有可变数量的组的正则表达式中的表情符号Unicode

时间:2014-02-07 16:37:18

标签: java regex unicode

我知道这是一个极端情况,但是我遇到了一个使用带有可变数量的组的正则表达式的代码

根据docs,这是合法的:

  

与a关联的捕获输入   小组总是后续的   该组最近匹配。如果一个   小组第二次评估   因为量化然后它   以前捕获的值,如果有的话,   如果是第二个,将被保留   评估失败。匹配字符串   “aba”反对表达式(a(b)?)+,   例如,将第二组设置为   “B”。所有捕获的输入都被丢弃   在每场比赛开始时。

然而,当我尝试使用unicode标志'GRINNING FACE WITH SMILING EYES'(U + 1F601)时,我得到了StringIndexOutOfBoundsException。

这是根据规格或错误预期的吗?

这是测试代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestEmoji {
    public static void main(String[] args)  {
        Pattern pattern = Pattern.compile("(A.)* EEE");

        testGroups(pattern, "ACAB EEE");
        testGroups(pattern,  "ABACA\uD83D\uDE01");

    }

    public static void testGroups(Pattern pattern, String s) {
        Matcher matcher = pattern.matcher(s);
        if (matcher.matches()) {
            System.out.println("matches");
            System.out.println(matcher.groupCount());
            for (int i = 1; i <= matcher.groupCount(); ++i) {
                System.out.println(matcher.group(i));
            }
        }
    }
}

和例外:

matches
1
AB
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -2
        at java.lang.String.charAt(String.java:658)
        at java.util.regex.Pattern$Slice.match(Pattern.java:3867)
        at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:4382)
        at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:4354)
        at java.util.regex.Pattern$GroupCurly.match(Pattern.java:4304)
        at java.util.regex.Matcher.match(Matcher.java:1221)
        at java.util.regex.Matcher.matches(Matcher.java:559)
        at TestEmoji.testGroups(TestEmoji.java:19)
        at TestEmoji.main(TestEmoji.java:12)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

1 个答案:

答案 0 :(得分:3)

在Java Bugs数据库中进行了一些挖掘之后,我找到了它:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8007395

JDK-8007395:当输入String包含代理UTF-16字符时Match.find()中的StringIndexOutofBoundsException