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

时间:2017-07-02 07:57:29

标签: java regex mapreduce stack-overflow

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

  

FATAL [main] org.apache.hadoop.mapred.YarnChild:运行子项时出错:   java.lang.StackOverflowError at   java.util.regex.Pattern中$ GroupHead.match(Pattern.java:4658)

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

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

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

我真的很感激有关此事的每一个反馈!

编辑:
这个字符串里面的URL是&lt;&gt;里面的文字&#34;&#34;和空格:
&LT;?\ janhaeussler.com/ sioc_type =用户安培; sioc_id = 1 /&GT; &#34; HEY&#34; &LT;。组织/ 1999/02/22 RDF-语法-NS#类型/&GT;

应该产生这3个字符串:
1.&lt; \ janhaeussler.com/?sioc_type = user&amp; sioc_id = 1 /&gt; (有或没有&lt;&gt;)
2.&#34;嘿&#34;
3.&lt; .org / 1999/02 / 22-rdf-syntax-ns #type /&gt;

编辑2:
我认为符号&lt;&gt;令人困惑。我试图找到一个正在分割一个或多个空格的正则表达式而不考虑其中的空间。 &#34;,因为网址没有空格。

3 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:0)

请勿使用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/>

答案 2 :(得分:0)

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

<[^>]+>|"[^"]+"|\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/>