var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre.*?<\/pre>/gm );
alert(arr); // null
我想要PRE块被拾取,即使它跨越换行符。我以为'm'旗就行了。没有。
在发帖前在这里找到答案。因为我认为我了解JavaScript(读了三本书,工作了几个小时),而且在SO没有现成的解决方案,所以无论如何我都敢发帖。在这里扔石头
所以解决方案是:
var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[\s\S]*?<\/pre>/gm );
alert(arr); // <pre>...</pre> :)
谁有更简单的方法?
编辑:这是一个复制品,但因为它比我的更难找到,我没有删除。
它提出[^]作为“多行点”。我仍然不明白的是为什么…不工作。我猜这是JavaScript的一个可悲的部分。
你没有指定你的环境和JavaScript (ECMAScript)版本,我知道这篇文章是2009年的,但只是为了完整:
随着ECMA2018的发布,我们现在可以使用s标志来引起。匹配\n(参见https://stackoverflow.com/a/36006948/141801)。
因此:
let s = 'I am a string\nover several\nlines.';
console.log('String: "' + s + '".');
let r = /string.*several.*lines/s; // Note 's' modifier
console.log('Match? ' + r.test(s)); // 'test' returns true
这是最近添加的,在目前的许多环境中都不能工作,例如Node v8.7.0似乎不能识别它,但它可以在Chromium中工作,我正在编写的Typescript测试中使用它,估计随着时间的推移,它会变得更加主流。
(。不工作,因为。[]里面没有特殊的含义,它只是一个字面意思。(.|\n)是一种指定“任何字符,包括换行符”的方法。如果你想匹配所有换行符,你还需要添加\r来包括Windows和经典的Mac OS风格的行结束符:(.|[\r\n])。
结果是有点麻烦,以及缓慢,(详情见KrisWebDev的答案),所以一个更好的方法是匹配所有空白字符和所有非空白字符,与[\s\ s],这将匹配所有,而且更快和更简单。
一般来说,不应该尝试使用regexp来匹配实际的HTML标记。例如,请看这些问题,了解更多关于原因的信息。
相反,尝试实际在DOM中搜索所需的标记(使用jQuery可以简化此操作,但您总是可以使用标准DOM执行document.getElementsByTagName(“pre”)),然后如果需要匹配这些内容,则使用regexp搜索这些结果的文本内容。