首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >匹配正则表达式时获取java.lang.StackOverflowError

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

Stack Overflow用户
提问于 2018-07-19 02:56:41
回答 1查看 2.3K关注 0票数 2

我使用的模式是,

代码语言:javascript
复制
Pattern listPattern = Pattern.compile(
            "\\s*'([^']*('')*)+'\\s*(,\\s*'([^']*('')*)+'\\s*)*"
                    + "|"
                    + "\\s*[0-9\\.\\-]+(,\\s*[0-9\\.-]+)*\\s*",
            Pattern.MULTILINE|Pattern.CASE_INSENSITIVE);

需要此模式来验证在sql查询中添加in()子句的输入是否正确,&值如下:

代码语言:javascript
复制
String value="'xyz2006201257200426888282d','xyz2006201300193058314082d'";

在这里我只使用了2个ids,但是当这个ids (例如xyz2006201257200426888282d)的数量更多(~ >600 ),我收到堆栈溢出异常。有人可以帮助解决正则表达式模式中由于发生堆栈溢出而导致的效率低下问题吗?

堆栈跟踪:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-19 04:01:48

我想你的基本问题是([^']*('')*)+这个条款

它可能添加了更多的步骤,而不是必要的。

更新:

您可以将其替换为一个展开的循环版本,该版本将显著

减少总体步骤。[^']*(?:''[^']*)*

重写它现在变成的正则表达式

代码语言:javascript
复制
"(\\s*'[^']*(?:''[^']*)*'(?:\\s*,\\s*'[^']*(?:''[^']*)*')*\\s*)|(\\s*[0-9.-]+(?:,\\s*[0-9.-]+)*\\s*)"

在此演示中,目标是800 'xyz2006201257200426888282d',间隔为

逗号。需要8010步。

https://regex101.com/r/WVrPBb/1

试一试,更糟的是它会堆栈溢出。

可读性版本

代码语言:javascript
复制
    (                             # (1 start)
         \s* 
         '
         [^']* 
         (?: '' [^']* )*
         ' 
         (?:
              \s* , \s* 
              '
              [^']* 
              (?: '' [^']* )*
              ' 
         )*
         \s* 
    )                             # (1 end)
 |  
    (                             # (2 start)
         \s* 
         [0-9.-]+ 
         (?:
              , \s* [0-9.-]+ 
         )*
         \s* 
    )                             # (2 end)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51409201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档