java - 将正则表达式应用于 str.split 方法时出现异常

标签 java android regex

当我在 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/

相关文章:

regex - awk if 条件中的数值表达式

java - addAll(Collection).. 不适用于参数(Iterable)

android - 我第一次从另一个 Activity 返回时没有调用 onConfigurationChanged

regex - .htaccess HTTPS 重定向(一页除外) laravel

java - 如何防止重新启动正在运行的服务 - Android

java - Volley.NoConnectionError : java. io.EOFException 0

Python Regex 在字符串上停止

java - 如何使用 HttpURLConnection 让此 HTTP/1.1 POST 在 Java 中工作?

java - 如何用 Jackson 定义 2 级继承结构

java - Spring Batch JdbcPagingItemReader 分页不起作用