栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

正则表达式中的StackOverflowError

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

正则表达式中的StackOverflowError

问题来自以下

(.|\n)*
部分
p6

Pattern p6=Pattern.compile("(BENCH:)((.|\n)*)(BENCH)((.|\n)*)(CITATION)");

(.|\n)*
可以在Oracle / OpenJDK JRE上编译为以下结构,其实现使用递归(请注意
GroupTail
参考资料
Loop
)来匹配
非确定性 模式的重复(在实现中,交替始终被视为 非确定性 )。

Prolog. Loop wrapperLoop [732768bb]. Greedy quantifier {0,2147483647}  GroupHead. (DEBUG) local=0  Branch. Alternation (in printed order):    Dot. (?:.), equivalent to [^nru0085u2028u2029]    ---    Single. Match pre point: U+000A LINE FEED (LF)    ---  BranchConn [204d080d]. Connect branches to sequel.  GroupTail [214b9e0c]. (DEBUG) local=0, group=2. --[next]--> Loop [732768bb]

在长字符串上,堆栈用完,所以得到

StackOverflowError

如果要毫无例外地匹配任何字符,则应

.
Pattern.DOTALL
flag
一起单独使用。

  • 您可以将标志传递给

    Pattern.compile(String regex, int flags)
    方法以打开整个表达式的标志:

    Pattern p6 = Pattern.compile("(BENCH:)(.*)(BENCH)(.*)(CITATION)", Pattern.DOTALL);
  • 或按照Jonny 5的评论中的建议,也可以使用内联标志

    (?s)

    Pattern p6 = Pattern.compile("(?s)(BENCH:)(.*)(BENCH)(.*)(CITATION)");
  • 另外,您也可以打开子模式的标志

    (?s:.*)

    Pattern p6 = Pattern.compile("(BENCH:)(?s:(.*))(BENCH)(?s:(.*))(CITATION)");

顺便说一句,您确定要

|onrable
参加
p3
吗?

Pattern p3 = Pattern.compile("(([H|h]on)|(HON)).*((ble)|BLE)(.*)");

如果不需要,请

|
从字符类中删除:

Pattern p3 = Pattern.compile("(([Hh]on)|(HON)).*((ble)|BLE)(.*)");

我还看到捕获组数量过多。请检查并检查它们是否确实必要。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506436.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号