使用正则表达式匹配一个大字符串时,会报java.lang.StackOverflowError。在网上搜了下 没找到比较好的解决方案,谁有比较好的解决办法说下! 要使用正则表达式的方式,其他的方式不太好(因为我的匹配模式比较复杂,所以觉得用正则比较方便)。下面大家都说说解决思路和办法吧! 谢谢!

解决方案 »

  1.   

    最好代码PASTE 出来
    没用的分组可以不捕获
      

  2.   

    跟分组没有多大关系吧 现在就是匹配的字符串长度太长了。
    比如说给定的字符串要满足以下条件
    (meta)*, (typedef)*, (import)*, (class|subclass|joined-subclass|union-subclass)*,(resultset)*,(query|sql-query)*,(filter-def)*,(database-object)+;但是字符串太长 就会报错,有什么比较好的方法!
      

  3.   

    匹配表达式加参数试试Pattern.compile(你的表达式,Pattern.DOTALL + Pattern.MULTILINE)
      

  4.   

    PS:DOTALL模式不一定需要,看你需求
      

  5.   


    这个我试过了 不行的! 有没有其他的外部jar能跳过堆栈操作的,我用了apache的regex jar也不行
      

  6.   

    如果你只想知道是匹配的结果,那分组都用非捕获的 (?:meta)* ...
    因为分组结果肯定是会占用空间的,至于效果咋样,你试试吧
      

  7.   

    楼主你不能详细说明,示意一下也好啊。你的字符串,以及你写的正则的思路。
    给定的字符串满足以下这个,单纯是这个的话。不要用正则了。
    (meta)*, (typedef)*, (import)*, (class|subclass|joined-subclass|union-subclass)*,(resultset)*, (query|sql-query)*,(filter-def)*,(database-object)+
    干嘛非要(meta)*这样,你直接if (str.contains("meta"))不就行了。
      

  8.   


    现在要判断字符串是否符合某个规则,就想DTD的约束那样 ,用字符的方法好像收不到那种效果的吧! 
      

  9.   

    既然这样,你可以试试这么做。
    所有的捕获组()都换成这样
    (?:meta)*,(?:typedef)*,……(?:class|subclass|joined-subclass|union-subclass)*……,意思并没有改变,只不过现在不放在内存里了。