当我在 android 之外,即在纯 java 环境中应用它时,这段代码完全运行。 (有一个链接说它是问题的重复,但它不是)我想知道为什么它在没有 android 的情况下在 java 中运行,但在 android 中崩溃。
String[] ar = new String[iters];
ar = myStr.split("(?<=\\G.{16})");
但是,当我在 android 环境中应用相同的内容时,出现以下异常
04-13 13:50:22.255: E/AndroidRuntime(2147): FATAL EXCEPTION: main
04-13 13:50:22.255: E/AndroidRuntime(2147): java.util.regex.PatternSyntaxException: Look-behind pattern matches must have a bounded maximum length near index 12:
04-13 13:50:22.255: E/AndroidRuntime(2147): (?<=\G.{16})
最佳答案
可能原因:
这看起来像是你的Android使用的Java版本的错误,在后来的Java版本中得到了纠正。
\G
可以被认为是一个 anchor ,它代表任何一个
- 上一场比赛结束
- 字符串的开头(如果还没有找到匹配项)
和任何 anchor 一样,它是 zero-length 。
我怀疑该错误的主要部分是 \G
被后视视为整个前一场比赛,而不是它的结尾,并且由于前一场比赛可能有 任何 长度,后视会提示它因为它无法确定明显的最大长度。
绕一圈。
避免 split("(?<=\\Gwhatever)")
。
不用查找定界符,而是使用 Matcher
类来对您想从文本中获取的内容进行 find()
。所以你的代码看起来像:
String myStr = "0123456789012345678901234567890123456789012345678901234567890123456789";
Matcher m = Pattern.compile(".{1,16}").matcher(myStr);
while (m.find()) {
String s = m.group();
//do what you want with current token stored in `s`
System.out.println(s);
}
输出:
0123456789012345
6789012345678901
2345678901234567
8901234567890123
456789
关于java - 将正则表达式应用于 str.split 方法时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29603616/