java - 使用正则表达式拆分字符串时的 Stackoverflow

标签 java regex mapreduce stack-overflow

我正在使用 Amazon Web Services 在 MapReduce 中做一个项目,我遇到了这个错误:

FATAL [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.StackOverflowError at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)

我阅读了一些其他问题来理解为什么会发生这种情况,而且我的正则表达式似乎有重复的替代路径。这是正则表达式:

\\s+(?=(?:(?<=[a-zA-Z])\"(?=[A-Za-z])|\"[^\"]*\"|[^\"])*$)

它的作用是按空格拆分,除非它们位于这些符号内 < >或者这些 " " .所以基本上采用这两种符号内的字符串。我尝试了许多其他版本,但都没有用,所以我离最佳版本还很远。我有点迷路,这是我第一次使用这些复杂的正则表达式。有人可以为我的正则表达式提供更好的选择吗?

我将非常感谢有关此的每条反馈!

编辑:
此字符串在 <> 内包含 URL,在 ""和空格内包含文本:
<\janhaeussler.com/?sioc_type=user&sioc_id=1/>“嘿”<.org/1999/02/22-rdf-syntax-ns#type/>

应该产生这 3 个字符串:
1. <\janhaeussler.com/?sioc_type=user&sioc_id=1/>(带或不带 <>)
2.“嘿”
3. <.org/1999/02/22-rdf-syntax-ns#type/>

编辑 2:
我认为符号 <> 令人困惑。我试图找到一个由一个或多个空格分隔的正则表达式,而不考虑“”内的空格,因为 url 没有空格。

最佳答案

试试这个:

\s+(?=(?:(?:[^"]*"){2})*[^"]*$)

Demo

    String string = "abc d<\\janhaeussler.com/?sioc_type=user &sioc_id=1/> \"HEY 1\" 2 3 <.org/1999/02/22-rdf-syntax-ns#type/> \"tra la\" <asdfadsf sadfasdf/> 4    \"sdf sdf\" 5 6";
    String[] res=string.split("\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)");
    System.out.println(Arrays.toString(res));

将输出:

[abc, d<\janhaeussler.com/?sioc_type=user, &sioc_id=1/>, "HEY 1", 2, 3, <.org/1999/02/22-rdf-syntax-ns#type/>, "tra la", <asdfadsf, sadfasdf/>, 4, "sdf sdf", 5, 6]

关于java - 使用正则表达式拆分字符串时的 Stackoverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44868612/

相关文章:

java - Spring Boot @WebMvcTest 中模拟方法返回值为 null

map - Hadoop:将slave设置为显式reducer?

regex - 使用正则表达式的脏话过滤器(100 个单词的列表)

python - 在 Google 应用引擎上运行 hadoop?

hadoop - 如何在代码中获取 Hadoop 中的统计信息?

java - 使用 GET 方法进行 POST、PUT 或 DELETE

java - eclipse java资源泄漏

Java Stream - 将数据行收集到更少的行中,并将一列分组到集合中

c# - 正则表达式匹配文本中的某个数字

python - 随机数据生成器在 python 中对正则表达式进行数学运算