多行字符串文字的正则表达式会产生“StackOverflowError”

2024-01-09

我想匹配三元组中包含的字符串"- 可能包含换行符的引号,以及不包含任何换行符的引号"""-除了最开始和最后的子字符串。

有效示例:

"""foo
bar "baz" blah"""

无效示例:

"""foo bar """ baz"""

我尝试使用以下正则表达式(如 JavaString文字):

"(?m)\"\"\"(?:[^\"]|(?:\"[^\"])|(?:\"\"[^\"]))*\"\"\""

它似乎适用于简短的例子。但是,在较长的示例中,例如由千行组成的字符串hello world,它给了我一个StackOverflowError.

用于重现错误的 Scala 片段

import java.util.regex.{Pattern, Matcher}

val text = "\"" * 3 + "hello world \n" * 1000 + "\"" * 3
val p = Pattern.compile("(?m)\"\"\"(?:[^\"]|(?:\"[^\"])|(?:\"\"[^\"]))*\"\"\"")
println(p.matcher("\"\"\" foo bar baz \n baz bar foo \"\"\"").lookingAt())
println(p.matcher(text).lookingAt())

(注意:本地测试,Scastie 超时;或者可能将 1000 减少到更小的数字?)。

产生相同错误的 Java 片段

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class RegexOverflowMain {
  public static void main(String[] args) {
    StringBuilder bldr = new StringBuilder();
    bldr.append("\"\"\"");
    for (int i = 0; i < 1000; i++) {
      bldr.append("hello world \n");
    }
    bldr.append("\"\"\"");
    String text = bldr.toString();
    Pattern p = Pattern.compile("(?m)\"\"\"(?:[^\"]|(?:\"[^\"])|(?:\"\"[^\"]))*\"\"\"");
    System.out.println(p.matcher("\"\"\" foo bar baz \n baz bar foo \"\"\"").lookingAt());
    System.out.println(p.matcher(text).lookingAt());
  }
}

Question

知道如何使这个“堆栈安全”,即有人可以找到一个接受相同语言但不产生StackOverflowError当输入到 Java 正则表达式 API 时?

我不在乎解决方案是 Scala 还是 Java(或其他),只要使用相同的底层 Java 正则表达式库即可。


解决方案使用负向前瞻来基本上查找以以下内容开头的字符串"""并结束于"""并且包含不包含的内容"""

作为普通正则表达式:^"""((?!""")[\s\S])*"""$

当 Java 转义正则表达式时:"^\"\"\"((?!\"\"\")[\\s\\S])*\"\"\"$"

\s\S包括换行符(基本上是.+ 换行符或.带单行标志)

这应该在没有多行标志的情况下使用,以便^ and $匹配字符串的开头和结尾,而不是行的开头和结尾

否则这个:

""" ab """abc""" abc """

会匹配

我也用它作为如何排除的参考""": 正则表达式匹配不包含单词的行? https://stackoverflow.com/questions/406230/regular-expression-to-match-a-line-that-doesnt-contain-a-word

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多行字符串文字的正则表达式会产生“StackOverflowError” 的相关文章

随机推荐

  • 在 Azure 函数中初始化 AutoMapper

    我正在尝试创建一个 Azure 函数 在其中使用 AutoMapper 的一些代码 我对 C Azure 和 AutoMapper 相当陌生 在寻找初始化 AutoMapper 配置的正确方法时遇到了一些困难 MapInitializer
  • ObjectDataSource 选择方法无法“查看”任何其他控件的值

    我什至不知道如何清楚地表达这一点 而且代码太多 无法全部粘贴到这里 让我从一般性描述开始 也许它会敲响警钟 我有一个使用 ObjectDataSource 的 DataGrid 由于需要两个日期选择器来过滤结果 ObjectDataSour
  • MongoDB 选择不同的和其中

    所以我正在做一个选择不同的工作 但我还想添加另一个键 data this gt db gt command array distinct gt scores key gt target user 我需要这样的东西 SELECT DISTIN
  • 使用 VSCode 调试 Electron 渲染器进程

    I tried 这个文件 https github com Microsoft vscode recipes tree master Electron 但是遇到了问题 我一张一张地浏览了指南 一切都很好 直到 1 将renderer js的
  • git:谁推入了 post-receive 挂钩

    如何确定谁推送到存储库 IE 有人这样做git push origin master并在 post receive 挂钩中originrepo 我需要使用某人的姓名或电子邮件 如果您使用 SSH 协议将更改推送到服务器 并且每个用户在服务器
  • 显示 UILabel 的文本

    继iOS 编程 大书呆子牧场指南 第六版的指南 我尝试使用 swift 制作一个测验项目 ViewController 代码在这里 import UIKit class ViewController UIViewController IBO
  • Java中的垃圾收集器是什么?

    我是 Java 新手 对 Java 中的垃圾收集器感到困惑 它实际上有什么作用以及何时发挥作用 请描述Java中垃圾收集器的一些属性 The 垃圾收集器 http en wikipedia org wiki Garbage collecti
  • 如何从 IDE 运行/调试 Streamlit 应用程序

    我真的很喜欢 Streamlit 作为研究环境 混合笔记本 仪表板式的输出 我可以使用纯代码快速设计其定义 无单元等 并且能够在运行时通过小部件影响我的代码 这是一个游戏规则改变者 为此 我正在寻找一种运行甚至调试 Streamlit 应用
  • 使用 LINQ 计算列表中给定对象的数量

    我有一个列表 其中可以包含同一对象的多次出现 现在我需要计算给定对象包含在该列表中的频率 int count 0 foreach IMyObject item in myList if item object2Count count 我确信
  • 如何修复致命错误:无效的标记压缩接近堆限制分配失败 - JavaScript 堆内存不足

    I got an error which is FATAL ERROR Ineffective mark compacts near heap limit Allocation failed JavaScript heap out of m
  • Hive 查询为匹配条件的行序列生成标识符

    假设我有以下配置单元表作为输入 我们称之为connections userid timestamp 1 1433258019 1 1433258020 2 1433258080 2 1433258083 2 1433258088 2 143
  • 已安装软件包,但出现找不到函数的错误 R [重复]

    这个问题在这里已经有答案了 可能的重复 错误 在 R 中找不到函数 https stackoverflow com questions 7027288 error could not find function in r 我正在尝试在 R
  • 如何创建 Kotlin 比较类型?

    刚刚学习定义 DateRange 类型 val wholeYear2017 Date 2017 1 1 Date 2017 12 31 所以我创建了如下类型 class DateRange
  • 删除特定用户代理的所有流量

    有没有办法排除所有属性和所有视图Google Analytics 的访问者特定用户代理 注意 这不是为了防止垃圾邮件 机器人 我已经检查过该功能管理 gt 查看设置 gt 机器人过滤 gt 排除来自已知机器人和蜘蛛的所有点击 就是去掉一部分
  • 从全局 Facebook ID 或用户名获取 Facebook 应用范围内的用户 ID

    如果您有 Facebook 例如 Zuckerbergs 用户 id 4 或用户名 zuck 您如何获取新的应用程序范围 idGraph v2 0使用应用程序的访问令牌 在文档中似乎找不到任何有关此内容的信息 这基本上是对相反问题的答案 从
  • TypeScript 1.3 受保护的错误

    最近在VS2013中安装了新的TS版本并尝试使用protected修饰符 然而 TS 验证器向我显示一个错误 并下划线protected带红线的词 我收到类似的错误 使用未来保留字 预期的 看起来它正在研究旧的 TS 定义 检查了项目文件
  • JSpec 不再受支持?

    来自 Ruby 社区 我正在寻找 Javascript Node js 的 BDD 测试框架 我是 JSpec 并且认为它是正确的选择 因为我在 Ruby 中使用了 RSpec 但在他们的 GitHub 页面上http github com
  • 是否可以在不显示原始数据的情况下内联管理?

    在 django 管理中 我有一个带有内联的模型 我希望能够仅显示内联的 添加新 行 而不显示属于内联的表中任何预先存在的原始数据 这可能吗 我尝试过每种组合max num and extra 并且它总是显示现有的表数据 Thanks 我认
  • D3 力定向图节点上的标签/文本

    我仍然不明白为什么下面的代码不显示其标签 文本 我已经定义了 css 并设置了当移动到节点上时的标题之类的属性 Json nodes name t1 group 1 name t2 group 1 name t3 group 1 name
  • 多行字符串文字的正则表达式会产生“StackOverflowError”

    我想匹配三元组中包含的字符串 可能包含换行符的引号 以及不包含任何换行符的引号 除了最开始和最后的子字符串 有效示例 foo bar baz blah 无效示例 foo bar baz 我尝试使用以下正则表达式 如 JavaString文字