如何在多行上使用JavaScript正则表达式? var ss=“aaaa\nbbb\ncccddd”; var arr=ss.match(/

如何在多行上使用JavaScript正则表达式? var ss=“aaaa\nbbb\ncccddd”; var arr=ss.match(/,javascript,regex,Javascript,Regex,[。\n]不起作用,因为[]中的点(根据正则表达式的定义;不仅仅是javascript)表示点字符。您可以使用(.|\n)(或(.|[\n\r])。[.\n]不起作用,因为在[],它只是意味着文字(.|\n)将是一种指定“任何字符,包括换行符”的方法。如果要匹配所有换行符,则需要添加\r以及包含Windows和经典Mac OS样式的行尾:(.|[\r\n]) 这有点麻烦,而且速度慢,(请参阅),因此更好的方法是将所有空白字符和所有非空白字符与[\s\s]匹配,这将匹配所有内容,并且更快、更简单

[。\n]
不起作用,因为
[]
中的点(根据正则表达式的定义;不仅仅是javascript)表示点字符。您可以使用
(.|\n)
(或
(.|[\n\r])

[.\n]
不起作用,因为
[]
,它只是意味着文字
(.|\n)
将是一种指定“任何字符,包括换行符”的方法。如果要匹配所有换行符,则需要添加
\r
以及包含Windows和经典Mac OS样式的行尾:
(.|[\r\n])

这有点麻烦,而且速度慢,(请参阅),因此更好的方法是将所有空白字符和所有非空白字符与
[\s\s]
匹配,这将匹配所有内容,并且更快、更简单

一般来说,您不应该尝试使用regexp来匹配实际的HTML标记

相反,试着在DOM中搜索所需的标记(使用jQuery会更容易,但您可以使用标准DOM执行
document.getElementsByTagName(“pre”)
),然后在需要匹配内容时使用regexp搜索这些结果的文本内容。

不要使用
(.|[\r\n])
而不是用于多行匹配的

对于多行匹配,请使用
[\s\s]
而不是

另外,使用
*?
+?
量词而不是
*
+
避免不需要的贪婪。这可能会对性能产生巨大影响

请参见我制定的基准:

注意:您也可以使用
[^]
,但下面的评论中不推荐使用它。

我已经测试过它(Chrome)并且它对我有效(包括
[^]
[^\0]
),方法是通过
[^\0]
[^]
更改点(
),因为点与换行符不匹配(参见此处:)

var ss=“aaaa\nbbb\ncccddd”;

var arr=ss.match(/除上述示例外,它是一种替代方法

 /<pre>.*?<\/pre>/gms

其中,
\w
表示文字,
\s
表示空白

您没有指定您的环境和Javascript版本(ECMAscript),我意识到这篇文章是从2009年开始的,但为了完整起见,随着ECMA2018的发布,我们现在可以使用
s
标志使
/code>匹配'\n',请参阅

因此:

这是最近添加的,在许多当前环境中都不起作用,例如Node v8.7.0似乎无法识别它,但它在Chromium中工作,我正在编写一个Typescript测试中使用它,随着时间的推移,它可能会变得更加主流

[\\w\\s]*

这一条对我来说毫无帮助,尤其是在匹配多个包含新行的内容时,每一个其他答案都只是将所有匹配项组合在一起。

现在有了s(单行)修饰符,它允许点匹配新行:) \s也将匹配新的行:D

只需在斜线后面加上s

/.*?/gms

一个不那么神秘的正则表达式?本质上不可能。顺便说一句,你应该读一下:“解析Html:TheCthulhuWay”链接与前面的注释不同:(5年后)我正在做的是使用JavaScript动态转换.wiki->HTML。因此,我没有可用的DOM。wiki文件主要是它自己的语法,但我允许在需要时使用HTML标记。如果我在DOM中处理此问题,您的建议非常有效。谢谢。:)很公平。我想这是想在HTML上使用正则表达式的一个正当理由,尽管与HTML混合的wiki语法本身可以有各种有趣的角落案例。
[\r\n]
应用于序列\r\n,首先匹配\r\n,然后匹配\r\n。如果要同时匹配整个序列,无论该序列是\r\n还是\r\n,请使用模式
\r?\n
来匹配整个多行字符串,尝试贪婪的
[\s\s]+
。我只想为后代添加忽略
内部
[]
不同于其他正则表达式框架,尤其是.NET中的高级框架。各位,请不要假设正则表达式是跨平台的,它们通常不是
[\s\s]
是最常见的JavaScript习惯用法,用于匹配包括换行符在内的所有内容。与基于交替的方法(如
(.|\n)
)相比,这种方法更直观,效率更高。(它的字面意思是“任何字符都是空白或任何字符都不是空白。)你是对的,但问题是关于
\n
,以及为什么
[.\n]
不起作用。正如问题中提到的,
[^]
也是一种很好的方法。优点是,但我建议不要使用
[^]
无论如何。一方面,JavaScript是我所知道的唯一一种支持该习惯用法的风格,即使在那里,它的使用频率也远不及
[\s\s]
。另一方面,大多数其他风格都让你先列出它来逃避
]
。换句话说,在JavaScript中
[^][^]
匹配任意两个字符,但在.NET中它匹配除
之外的任何一个字符[
,或
^
。您如何知道
\S
与其他字符相匹配
\r
\n
与其他字符相匹配?有关详细信息,请参阅。这是一种将所有空白字符+所有非空白字符=所有字符相匹配的方法。有关regexp特殊字符文档,请参阅。是否有理由选择
[\S\S]
超过了其他人,比如
[\d\d]
[\w\w]
?让我快速指出,您对贪婪运算符的测试是被操纵的。
/Can[^]*?/
与相同的条件不匹配
var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[\s\S]*?<\/pre>/gm );
alert(arr);     // <pre>...</pre> :)
Using [^]: fastest
Using [\s\S]: 0.83% slower
Using (.|\r|\n): 96% slower
Using (.|[\r\n]): 96% slower
^[\\w\\s]*$
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
 /<pre>.*?<\/pre>/gms