gpt4 book ai didi

java - 匹配 Java 字符串的正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:45 24 4
gpt4 key购买 nike

在 Scala 的解析器组合器中(特别是 JavaTokensParser)有一个定义 stringLiteral匹配类似 Java 的字符串。

def stringLiteral: Parser[String] =
("\""+"""([^"\p{Cntrl}\\]|\\[\\'"bfnrt]|\\u[a-fA-F0-9]{4})*"""+"\"").r

不幸的是,这个正则表达式 does not work for long strings .有谁知道可以重复使用的实现,或者对正则表达式的修改更节省空间?

最佳答案

有趣的问题!!

只是玩弄这个,并想出了以下内容:

val r = ("\"" + "(?:[^\"\\p{Cntrl}\\\\]*|(?:\\\\(?:[\\\\'\"bfnrt]|u[a-fA-F0-9]{4}))*)*" + "\"").r

注意:上面的正则表达式从第一个版本开始就修复了……前导“\”和尾随字符都需要重复,而不仅仅是像我最初那样的尾随字符!

编辑: 找到一个更有效的正则表达式。使用以下内容,它可以解析多达 950 个 \\ns 对的字符串,而不是只能解析 556 个的原始字符串,至少在我的默认配置中是这样。

val r = ("\"" + "(?:[^\"\\p{Cntrl}\\\\]*|\\\\[\\\\'\"bfnrt]|\\\\u[a-fA-F0-9]{4})*" + "\"").r

编辑 2:根据@schmmd 的评论,我有一个更好的正则表达式。这个可以解析2500个\ns的拷问案。秘诀是使用贪婪占有修饰符,这基本上关闭了回溯的需要,因此也关闭了递归。

val r = (""""([^"\p{Cntrl}\\]*+(?:\\[\\'"bfnrt])*+(?:\\u[a-fA-F0-9]{4})*+)*+"""").r

解决方案的本质是每次匹配某样东西时尽可能多地咀嚼。

scala> val r = (""""([^"\p{Cntrl}\\]*+(?:\\[\\'"bfnrt])*+(?:\\u[a-fA-F0-9]{4})*+)*+"""").r
r: scala.util.matching.Regex = "([^"\p{Cntrl}\\]*+(?:\\[\\'"bfnrt])*+(?:\\u[a-fA-F0-9]{4})*+)*+"

scala> r.pattern.matcher("\"" + "\\ns" * 2500 + "\"").lookingAt
res4: Boolean = true

scala> r.pattern.matcher("\"" + "s" * 2500 + "\"").lookingAt
res5: Boolean = true

更新: A pull request已提交给 scala 人员。它被接受了。

关于java - 匹配 Java 字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19232919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com