当前位置: 首页 > 知识库问答 >
问题:

匹配开始/结束标记的Java regex导致堆栈溢出

蒙化
2023-03-14
<Data>(?<data>(?:.|\r|\n)+?)</Data>

上面的正则表达式与matcher.find()方法一起使用,以读取“数据”捕获组,并按预期工作,直到提供的输入字符串长度超过1,200个字符左右,在这种情况下会导致堆栈溢出。

可以重写上面的正则表达式以避免堆栈溢出问题吗?

共有1个答案

贺华容
2023-03-14

有关堆栈溢出问题来源的更多详细信息:

有时,regexpattern类会抛出StackOverflowError。这是已知bug#5050507的一种表现,该bug#5050507自Java1.4以来一直存在于Java.util.regex包中。bug在这里停留,因为它有“无法修复”的状态。发生此错误的原因是pattern类将正则表达式编译为一个小程序,然后执行该小程序以查找匹配项。这个程序是递归使用的,有时当进行太多的递归调用时,就会出现这个错误。有关更多详细信息,请参阅bug的说明。它似乎主要是由交替的使用引发的。

您的regex(有交替)匹配两个标记之间的任何1+字符。

(?s)<Data>(?<data>.+?)</Data>
<Data>(?<data>[^<]*(?:<(?!/?Data>)[^<]*)*)</Data>
    null
 类似资料:
  • 问题内容: 该类的标准实现使用递归来实现多种形式的正则表达式(例如,某些运算符,替换)。 这种方法会导致输入字符串超过(相对较小)长度(可能不超过1,000个字符)的堆栈溢出问题,具体取决于所涉及的正则表达式。 一个典型的例子是以下正则表达式,它使用交替从周围的XML字符串中提取可能的多行元素(名为),该元素已经提供了: 上面的正则表达式与该方法一起使用,以读取“数据”捕获组并按预期工作,直到提供

  • 问题内容: 这有效:http : //play.golang.org/p/-Kv3xAguDR。 这导致堆栈溢出:http : //play.golang.org/p/1-AsHFj51O。 我不明白为什么。在这种情况下,使用接口的正确方法是什么? 问题答案: 这个 将呼叫您的,依次呼叫,等等。如果您需要解组JSON然后对其进行处理,那么一种巧妙的技术是声明一个本地类型,将数据解组到其中,然后转换

  • 我正在使用一个正则表达式从任意长的输入字符串中提取键值对,并且遇到了这样的情况:对于具有重复模式的长字符串,它会导致堆栈溢出。 KV解析代码如下所示: 一些虚构的输出示例: 我显式地将generic放在上面,而不是在解析之前检查最大字符串长度的hacks(例如)。 我能想出的最粗俗的解决方法,一个真正的反模式,是 有趣的是,它在我试过的几次运行中都起作用了,但它不是一个值得推荐的有品位的东西。:-

  • 我找不到堆栈溢出的来源,但似乎是外部的循环造成的。 提前道谢!

  • 问题内容: TL; DR: 将任何非内置函数添加到Array.prototype AND Function.prototype将导致IE8本机JSON解析器在解析包含数组的任何JSON时发生堆栈溢出,但仅当您还传递了reviver函数时放入JSON.parse()。 最初这是一个问题,但我回答了我自己的原始问题,所以现在我要问:有人能想到此IE8错误的解决方法,该方法不涉及消除所有修改Array.

  • 我有一个名为User的实体,它有一组角色。我还有一个角色实体,它有一组用户。(这只是出于学习目的的实践应用。) 问题是——我有一个UserController(REST API)来发送用户列表——这会导致StackOverFlow错误。用户试图加载角色,而角色又试图加载用户等。 我的问题是——如何避免这种情况?我也看到许多类似的设计。例如:https://viralpatel.net/blogs/