java - 简单的正则表达式在 Scala/Java 中的大字符串上出现 stackoverflow 失败
问题描述
我需要一个正则表达式来检查它是否是一个带引号的(由')字符串,里面可能有转义的\'。所以,我想出了以下正则表达式,\'(\\.|[^\'])*\'
.
"""\'(\\.|[^\'])*\'""".r.findFirstIn(s"'${"a"*100}'")
它适用于小字符串,但stack overflow
在大小 > 3000 字节时失败。
"""\'(\\.|[^\'])*\'""".r.findFirstIn(s"'${"a"*5000}'")
这是 Scala 片段。它在内部运行java.util.regex
,所以这是 java/jvm 问题。
据我所知,那些简单的正则表达式不应该导致stack overflow
,它是一个简单的 DFA/NFA,内部没有任何递归。
如何解决这个问题?
我需要正则表达式(这是解析器组合器代码的一部分,我不能只编写检查属性的自定义代码)。
为什么里面有递归?
解决方案
您可以尝试J. Friedl 概述的经典展开循环技术:
' # the start delimiter
([^\\']* # anything but the end of the string or the escape char
(?:\\. # the escape char preceding an escaped char (any char)
[^\\']* # anything but the end of the string or the escape char
)*) # repeat
' # the end delimiter
推荐阅读
- c - 在(rand() >> 7) & 0xFF中,rand() >> 7的意义是什么?
- c# - 为什么 protobuf-net 反序列化对象不是“精简”的
- pthreads - 将 POSIX 函数移植到 freertos
- c# - 使用多线程/并行查找工作端口
- entity-framework - 通过批处理文件删除某些文本
- npm - NPM 未安装软件包但纱线正在工作
- java - PSQLException 在“$$ DECLARE”处或附近未终止的美元引号字符串,同时从 Spring 应用程序执行 sql 文件
- python - 将字符串值覆盖到日期时间
- python - “pipenv install”导致“OSError: Command .../python2.7 - setuptools pip wheel failed with error code 1”
- visual-studio-2010 - SSIS 从文件名中获取日期