Java 将正则表达式应用于str.split方法时获取异常
当我在android之外应用它时,也就是说,在纯java环境中,这段代码完全可以运行。(有一个链接说这是一个双重问题,但不是)我想知道为什么它在没有android的java中运行,但在android中崩溃Java 将正则表达式应用于str.split方法时获取异常,java,android,regex,Java,Android,Regex,当我在android之外应用它时,也就是说,在纯java环境中,这段代码完全可以运行。(有一个链接说这是一个双重问题,但不是)我想知道为什么它在没有android的java中运行,但在android中崩溃 String[] ar = new String[iters]; ar = myStr.split("(?<=\\G.{16})"); String[]ar=新字符串[iters]; ar=myStr.split(“(?可能原因: 它看起来像是您的Android正在使用的Java版本的
String[] ar = new String[iters];
ar = myStr.split("(?<=\\G.{16})");
String[]ar=新字符串[iters];
ar=myStr.split(“(?可能原因:
它看起来像是您的Android正在使用的Java版本的一个bug,在以后的Java版本中得到了纠正
可以被视为锚,代表
- 上一场比赛结束
- 字符串的开头(如果尚未找到匹配项)
就像任何锚一样
我怀疑这个bug的主要部分是,look back将\G
视为整个上一个匹配,而不是它的结束,并且由于上一个匹配可能有任何长度,look back会抱怨它,因为它无法确定明显的最大长度
到处都是。
避免拆分((?可能原因:
它看起来像是您的Android正在使用的Java版本的一个bug,在以后的Java版本中得到了纠正
可以被视为锚,代表
- 上一场比赛结束
- 字符串的开头(如果尚未找到匹配项)
就像任何锚一样
我怀疑这个bug的主要部分是,look back将\G
视为整个上一个匹配,而不是它的结束,并且由于上一个匹配可能有任何长度,look back会抱怨它,因为它无法确定明显的最大长度
到处都是。
避免split((?避免(?@Pshemo您能提供一个使用这些的工作示例吗?好的,我发布了一个关于如何使用模式和匹配器类重写代码的示例。我没有添加负责在数组中存储每个令牌的代码,因为我不知道您是否真的需要它,因为您可能已经处理了m.group()返回的每个令牌
如您所愿(在我的代码中,我会打印它,但您可以将它存储在ArrayList之类的列表中,稍后再使用)。@Pshemo非常感谢。确实。不需要数组,因为我可以直接使用它们(我正在这样做)thanksAvoid(?@Pshemo您能提供一个使用这些的工作示例吗?好的,我发布了一个关于如何使用模式和匹配器类重写代码的示例。我没有添加负责在数组中存储每个令牌的代码,因为我不知道您是否真的需要它,因为您可能已经处理了m.group()返回的每个令牌
如您所愿(在我的代码中,我会打印它,但您可以将它存储在一些列表中,如ArrayList中,稍后再使用)。@Pshemo非常感谢。的确。不需要数组,因为我可以直接使用它们(我正在这样做)感谢这是一个很好的解决方案,但我不同意您的分析。\G
是一个零宽度断言;它匹配上一次匹配结束的位置。它不使用任何字符,因此不会影响lookbehinds中匹配内容的长度。\G
在lookbehinds中一直在Java中工作,应该在Andr中工作oid.@Alanmore我也认为它应该以您提到的方式工作,但我记得有一个问题使我对它产生了一些怀疑。我不记得它到底是哪个Java版本,也不记得正则表达式是什么样子,但有一个例子我有(?很好的解决方案,但我不同意您的分析。\G
是一个零宽度断言;它匹配上一次匹配结束的位置。它不消耗任何字符,因此不会影响lookbehind中匹配内容的长度。\G
在lookbehinds中一直在Java中工作,应该在Android中工作@Alanmore我也认为它应该以你们提到的方式工作,但我记得有一个问题让我对它有点怀疑。我不记得它是哪个Java版本,也不记得正则表达式是什么样子,但我有一个例子,(?
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})
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