使用正则表达式拆分字符串时的 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})*[^"]*$)
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/>
我正在使用 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})*[^"]*$)
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/>