Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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.StackOverflowerError_Java_Regex - Fatal编程技术网

匹配正则表达式时获取java.lang.StackOverflowerError

匹配正则表达式时获取java.lang.StackOverflowerError,java,regex,Java,Regex,我使用的模式是 Pattern listPattern = Pattern.compile( "\\s*'([^']*('')*)+'\\s*(,\\s*'([^']*('')*)+'\\s*)*" + "|" + "\\s*[0-9\\.\\-]+(,\\s*[0-9\\.-]+)*\\s*", Pattern.MULTILINE|Pattern.CASE_INSEN

我使用的模式是

Pattern listPattern = Pattern.compile(
            "\\s*'([^']*('')*)+'\\s*(,\\s*'([^']*('')*)+'\\s*)*"
                    + "|"
                    + "\\s*[0-9\\.\\-]+(,\\s*[0-9\\.-]+)*\\s*",
            Pattern.MULTILINE|Pattern.CASE_INSENSITIVE);
需要此模式来验证输入是否正确,以便添加到sql查询中的in()子句中,&值如下:

String value="'xyz2006201257200426888282d','xyz2006201300193058314082d'";
这里我只使用了两个ID,但是当这个ID(例如xyz20062001257200426888282d)的数量更多(~>600)时,我得到了堆栈溢出异常。 有人能帮助解决正则表达式模式中的低效问题吗?因为发生了哪个堆栈溢出

堆栈跟踪:

Exception in thread "main" java.lang.StackOverflowError
at java.lang.Character.codePointAt(Character.java:4866)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3775)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4250)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:4485)
at java.util.regex.Pattern$GroupCurly.match(Pattern.java:4405)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4272)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4801)
at java.util.regex.Pattern$Prolog.match(Pattern.java:4741)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
at java.util.regex.Pattern$Loop.match(Pattern.java:4794)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:4485)
at java.util.regex.Pattern$GroupCurly.match(Pattern.java:4405)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:4485)
at java.util.regex.Pattern$GroupCurly.match(Pattern.java:4405)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4272)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4801)
at java.util.regex.Pattern$Prolog.match(Pattern.java:4741)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
at java.util.regex.Pattern$Loop.match(Pattern.java:4794)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:4485)
at java.util.regex.Pattern$GroupCurly.match(Pattern.java:4405)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:4485)
at java.util.regex.Pattern$GroupCurly.match(Pattern.java:4405)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4272)

我认为你的基本问题是这个子句
([^']*('')+

这可能会增加更多的步骤

更新:
您可以将其替换为一个展开的循环版本,该版本将显著
减少总体步骤<代码>[^']*(?:''[^']*)*

重写正则表达式现在变成

"(\\s*'[^']*(?:''[^']*)*'(?:\\s*,\\s*'[^']*(?:''[^']*)*')*\\s*)|(\\s*[0-9.-]+(?:,\\s*[0-9.-]+)*\\s*)"
在这个演示中,目标是800
'xyz20062001257200426888282d'
,由
逗号的。它需要8010个步骤

试一试,更糟的情况是堆栈溢出

可读版本

    (                             # (1 start)
         \s* 
         '
         [^']* 
         (?: '' [^']* )*
         ' 
         (?:
              \s* , \s* 
              '
              [^']* 
              (?: '' [^']* )*
              ' 
         )*
         \s* 
    )                             # (1 end)
 |  
    (                             # (2 start)
         \s* 
         [0-9.-]+ 
         (?:
              , \s* [0-9.-]+ 
         )*
         \s* 
    )                             # (2 end)

请包含您正在接收的异常的堆栈跟踪。将所有
替换为
(?:
)将减少正则表达式引擎遍历字符串时的开销。仍将获得堆栈溢出异常☹.请解释你的想法reasoning@dhanu10896-添加了一个使用展开循环的更新。这可能是您能做的最好的了。此外,如果您有奇怪的数据,您可以根据需要将所有群集组设置为原子。例如,将所有
(?:
更改为
(?>