Rhino中非终止的RegExp.exec

时间:2010-07-11 06:14:18

标签: javascript html regex rhino

我将以下JavaScript程序保存在文件pre.js中:

var pre = readFile("method-help.html");
RegExp.multiline = true;
print(/<pre>((?:.|\s)+)<\/pre>/.exec(pre)[1]);

method-help.html的内容只是http://api.stackoverflow.com/1.0/help/method?method=answers/%7bid%7d的页面。我要做的是在pre标记之间获取JSON代码。但是,当我在Rhino中运行程序时,没有打印出任何内容,程序也不会终止。我使用的命令是:

java -jar js.jar pre.js

我的Rhino版本是1_7R2。

1 个答案:

答案 0 :(得分:2)

它似乎没有终止的原因可能是由于.\s重叠导致的灾难性回溯(它最终会结束,但可能需要很长时间)。这是一个正确,快速的版本:

var pre = readFile("method-help.html");
print(/<pre>([\s\S]*?)<\/pre>/.exec(pre)[1])

您不需要multiline。这只会影响您未使用的^$的含义。但是,我们使用\s\S来表示所有字符(包括换行符等)。我们还使用*?来表示零个或多个字符,非贪婪。问号(非贪婪)在这里无关紧要,但如果有多个pre块则会出现问题。