【发布时间】:2014-03-05 04:21:04
【问题描述】:
我知道这是一个极端情况,但我遇到了一个使用正则表达式和可变组数的代码
根据docs,这是合法的:
捕获的与 a 关联的输入 组始终是 最近匹配的组。如果一个 第二次评估组 因为量化然后它 先前捕获的值(如果有), 如果第二个将被保留 评估失败。匹配字符串 "aba" 反对表达式 (a(b)?)+, 例如,将第二组设置为 “乙”。所有捕获的输入都被丢弃 在每场比赛开始时。
但是,当我尝试将其与 unicode 符号“带微笑的眼睛的笑脸”(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)
【问题讨论】:
-
您的正则表达式与
ABACA\uD83D\uDE01中的任何一个都不匹配,其中没有“EEE”。 -
@sln 它在比赛中崩溃