Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组数可变的正则表达式中的表情Unicode_Java_Regex_Unicode - Fatal编程技术网

Java 组数可变的正则表达式中的表情Unicode

Java 组数可变的正则表达式中的表情Unicode,java,regex,unicode,Java,Regex,Unicode,我知道这是一个极端情况,但我遇到了一个使用正则表达式和可变组数的代码 根据这项法律: 捕获的输入与 组始终是 最近一次配对的小组。如果 对组进行第二次评估 因为量化,所以它 以前捕获的值(如果有), 如果第二个 评估失败。匹配字符串 “aba”反对(a(b)+, 例如,将组2设置为 “b”。所有捕获的输入都将被丢弃 在每场比赛开始时 然而,当我尝试将其与unicode符号“微笑的脸和微笑的眼睛”(U+1F601)一起使用时,我得到了StringIndexOutOfBoundsException

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

根据这项法律:

捕获的输入与 组始终是 最近一次配对的小组。如果 对组进行第二次评估 因为量化,所以它 以前捕获的值(如果有), 如果第二个 评估失败。匹配字符串 “aba”反对(a(b)+, 例如,将组2设置为 “b”。所有捕获的输入都将被丢弃 在每场比赛开始时

然而,当我尝试将其与unicode符号“微笑的脸和微笑的眼睛”(U+1F601)一起使用时,我得到了StringIndexOutOfBoundsException

这是根据规范预期的还是一个bug

以下是测试代码:

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));
            }
        }
    }
}

在深入挖掘Java Bugs数据库后,我发现了它:


JDK-8007395:StringIndexOutofBoundsException in Match.find()当输入字符串包含代理UTF-16字符时,您的正则表达式将不匹配此
ABACA\uD83D\uDE01
中的任何字符。@sln它在匹配中崩溃在这种情况下,引擎应该在打印“匹配”之前崩溃。为什么它成功了?我明白了,它打印了第一个字符串,然后引擎在第二个字符串匹配过程中失败了。那么,修复方法是什么?如果发动机在UTF16字符时停止,是否将字符串转换为utf8?-因此,它在更新版本中已修复。在链接中,请参阅问题描述:3。当模式与输入字符串不匹配时。解决方法:捕获异常并将其视为“false”返回值。
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)