Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用正则表达式解析大字符串以获取java.lang.StackOverflower错误_Java_Regex_Stack Overflow_Tokenize - Fatal编程技术网

使用正则表达式解析大字符串以获取java.lang.StackOverflower错误

使用正则表达式解析大字符串以获取java.lang.StackOverflower错误,java,regex,stack-overflow,tokenize,Java,Regex,Stack Overflow,Tokenize,这是我的正则表达式 "(?<=\"body\":\")((?=\",|\"$)|.)+" 结果是 its my string 但是当我使用一个大的输入字符串时,我得到了这个错误 Exception in thread "main" java.lang.StackOverflowError at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168) at java.util.regex.Pattern$Loop.match(

这是我的正则表达式

"(?<=\"body\":\")((?=\",|\"$)|.)+"
结果是

its my string
但是当我使用一个大的输入字符串时,我得到了这个错误

Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345)
at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)

这是如何导致的,我如何解决它?

看起来您试图捕获RHS字符串的内容,同时强制它前面加上
“body”:“
,后面加上

您似乎在使用lookaround断言来测试周围文本的存在性,但您也在使用捕获组来捕获RHS字符串的内容。你不需要同时做这两件事。Lookaround断言的宽度为零,这意味着它们不会构成最终匹配的子字符串的一部分。最终匹配的子字符串始终可以作为捕获组0访问。或者,您可以完全匹配所有正则表达式组件(意味着非零宽度匹配,意味着没有lookarounds),并使用捕获组来提取感兴趣的子字符串,但这样效率较低

下面是我认为应该如何编写的(与此演示的
args[0]
匹配):

输出

Perl(来自shell)


因此,我要澄清的是,我在回答的开头给出的解决方案之所以避免了堆栈溢出错误,并不是因为我删除了捕获组1,而是因为我删除了替换。同样,我不知道为什么要用递归实现重复的交替,但考虑到这一事实,大的输入字符串会导致堆栈溢出错误似乎是合乎逻辑的。

这可能是灾难性的回溯。你到底想干什么?你的正则表达式似乎不起作用。
Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345)
at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
Pattern p = Pattern.compile("(?<=\"body\":\")[^\"]*(?=\")");
Matcher m = p.matcher(args[0]);
if (!m.find(0)) { System.out.println("doesn't match!"); System.exit(1); }
System.out.println(m.group(0));
Pattern p = Pattern.compile("(?<=\"body\":\")(?:\\\\.|[^\"])*(?=\")");
Matcher m = p.matcher(args[0]);
if (!m.find(0)) { System.out.println("doesn't match!"); System.exit(1); }
System.out.println(m.group(0));
Exception in thread "main" java.lang.StackOverflowError
  at java.util.regex.Pattern$CharProperty.match(Unknown Source)
  at java.util.regex.Pattern$Branch.match(Unknown Source)
  at java.util.regex.Pattern$GroupHead.match(Unknown Source)
  at java.util.regex.Pattern$Loop.match(Unknown Source)
  at java.util.regex.Pattern$GroupTail.match(Unknown Source)
  at java.util.regex.Pattern$BranchConn.match(Unknown Source)
  at java.util.regex.Pattern$CharProperty.match(Unknown Source)
  at java.util.regex.Pattern$Branch.match(Unknown Source)
  at java.util.regex.Pattern$GroupHead.match(Unknown Source)
  at java.util.regex.Pattern$Loop.match(Unknown Source)
  at java.util.regex.Pattern$GroupTail.match(Unknown Source)
...
largeString="\"body\":\"$(perl -e 'use strict; use warnings; for (my $i = 0; $i < 2**15; ++$i) { print("x"); }';)\"";
perl -e 'use strict; use warnings; my $re = qr((?<="body":")(?:\\.|[^"])*(?=")); if ($ARGV[0] !~ $re) { print("didn'\''t match!\n"); } print($&);' "$largeString";
Complex regular subexpression recursion limit (32766) exceeded at -e line 1.
didn't match!
Use of uninitialized value $& in print at -e line 1.