Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.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 将正则表达式应用于str.split方法时获取异常_Java_Android_Regex - Fatal编程技术网

Java 将正则表达式应用于str.split方法时获取异常

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版本的

当我在android之外应用它时,也就是说,在纯java环境中,这段代码完全可以运行。(有一个链接说这是一个双重问题,但不是)我想知道为什么它在没有android的java中运行,但在android中崩溃

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