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

Stackoverflow when splitting string using regex

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

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

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

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

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

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

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

应该生成这 3 个字符串:
1. <\janhaeussler.com/?sioc_type=user&sioc_id=1/>(有无<>)
2."HEY"
3.<.org/1999/02/22-rdf-syntax-ns#type/>

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

试试这个:

\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]

不要使用 split()。使用 find() 循环代替,使用此正则表达式:

(?:<[^<]*>
   |
   "[^"]*"
   |
   \S
   )+

示例:

String input = "<\janhaeussler.com/?sioc_type=user&sioc_id=1/> \"HEY\" <.org/1999/02/22-rdf-syntax-ns#type/>";

Pattern p = Pattern.compile("(?:<[^<]*>|\"[^\"]*\"|\S)+");
for (Matcher m = p.matcher(input); m.find(); ) {
    System.out.println(m.group());
}

输出

<\janhaeussler.com/?sioc_type=user&sioc_id=1/>
"HEY"
<.org/1999/02/22-rdf-syntax-ns#type/>

您可以尝试匹配:标签或双引号之间的内容或剩余的非空格。

<[^>]+>|"[^"]+"|\S+

例如:

String str = "<\janhaeussler.com/?sioc_type=user&sioc_id=1/> \"HEY\" YOU! \"How Are You?\" <.org/1999/02/22-rdf-syntax-ns#type/>";

final java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("<[^>]+>|\"[^\"]+\"|\S+");
java.util.regex.Matcher matcher = pattern.matcher(str);

while (matcher.find()) {
    System.out.println("match: " + matcher.group(0));
}

打印:

match: <\janhaeussler.com/?sioc_type=user&sioc_id=1/>
match: "HEY"
match: YOU!
match: "How Are You?"
match: <.org/1999/02/22-rdf-syntax-ns#type/>