【发布时间】: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.indexOf和String.substring。 -
如果您想要一个快速而肮脏的解决方案,请获取所有
xsd:base64Binary标签和所有responseData标签的位置,然后使用splice()手动进行替换。不知道你会得到什么样的表现 -
[^<]仅表示除“
标签: javascript regex wakanda