【问题标题】:Is there a length limitation when using replace method of a string?使用字符串的替换方法时是否有长度限制?
【发布时间】:2015-12-16 14:53:29
【问题描述】:

我有一个大字符串(1116902 字符长度),我想用正则表达式(非常简单)处理它。我从一个以 base64 编码的肥皂服务器得到响应。所以我只是在适当的 xml 标签之间得到结果,然后解码响应。

这适用于一个小请求。但是当我得到一个很大的响应时,replace() 方法的回调函数永远不会被调用。我曾尝试在 regex101 网站上测试该字符串,它可以找到结果。所以我想知道我的 JavaScript 引擎是否存在限制。我正在开发一个使用 Webkit 作为 JavaScript 引擎的 Wakanda Server V10。我无法提供该字符串,因为它包含一些企业信息。

这是我的正则表达式:/xsd:base64Binary">((.|\n)*?)<\/responseData>/

我教过它可能是一个不包含在((.|\n)*?) 组中的特殊字符。但是为什么 regex101 找出结果(那么可能是 JavaScript 引擎)

也许有人可以帮助我?

谢谢

【问题讨论】:

  • (.|\n)* 会导致如此多的回溯,以至于引擎很快就会陷入灾难性回溯。使用(.|\n)*? 时,可能会出现超时问题,其中大字符串无法找到结束分隔符或距离起始分隔符太远(类似问题)。解析 XML 或 HTML 时,请使用相应的解析器而不是正则表达式。
  • 所以它是 XML。使用 XML 解析器,这里是an example of parsing a string into an XML tree and getting an attribute value。只需稍微修改一下即可获得元素值。还有其他解析 XML 的方法,请在此处查看其他 cmets。
  • 另一种可能比正则表达式和 xml 解析器性能更好的方法是使用简单的 String.indexOfString.substring
  • 如果您想要一个快速而肮脏的解决方案,请获取所有xsd:base64Binary 标签和所有responseData 标签的位置,然后使用splice() 手动进行替换。不知道你会得到什么样的表现
  • [^<] 仅表示除“

标签: javascript regex wakanda


【解决方案1】:

如果你能保证你的开始和结束分隔符之间没有标签,听起来可能是这种情况,你可以把你的 RE 改成

/xsd:base64Binary">([^<]*)<\/responseData>/ 

这不需要任何回溯,可能对你有用。

[^&lt;] 仅表示除&lt; 字符之外的所有内容。因为在您的部分的开始标签和结束标签之间不应该有任何标签(至少这是我所理解的),它将接受所有内容,直到您点击结束标签。重要的是,RE 引擎可以立即判断某些内容是否匹配,因此不需要分支或回溯。

【讨论】:

  • 非常感谢。我了解更多关于正则表达式的信息。它并没有那么复杂,但我认为除了我确定我永远不会得到的东西之外,我并没有想到要得到所有东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2012-11-09
  • 2012-11-02
  • 2017-04-02
相关资源
最近更新 更多