Javascript正则表达式多行标志不起作用

Javascript regex multiline flag doesn't work

我编写了一个regex来从HTML中获取字符串,但似乎多行标志不起作用。

这是我的模式,我想得到h1标签中的文本。

1
2
3
var pattern= /.*([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];

我创建了一个字符串来测试它。当字符串包含""时,结果始终为空。如果我删除了所有的"",无论是否带有/m标志,它都会给我正确的结果。

我的瑞格鞋怎么了?


您正在查找/.../s修饰符,也称为dotall修饰符。它强制dot .也匹配换行符,默认情况下不匹配换行符。

坏消息是它在javascript中不存在(从ES2018开始,见下文)。好消息是,您可以使用一个字符类(如\s和它的否定(\s一起使用)来解决它,如下所示:

1
[\s\S]

所以在你的例子中,regex会变成:

1
/[\s\S]*([^<]+?)<\/h1>/i

截至ES2018年,javascript支持EDOCX1(dotall)标志,因此在现代环境中,您的正则表达式可以是您编写的那样,但末尾有s标志(而不是mm更改^$的工作方式,而不是.):

1
/.*([^<]+?)<\/h1>/is


您需要s修改器(dotall),它显然不存在于javascript中—您可以用@molf建议的[ss]替换.m修饰符(多行)使^和$匹配行,而不是整个字符串。


在Nodejs6.11.3中,[\s\S]并没有为我工作。根据regexp文档,它说要使用[^],这对我有用。

(The dot, the decimal point) matches any single character except line
terminators:
,
, \u2028 or \u2029.

Inside a character set, the dot loses its special meaning and matches
a literal dot.

Note that the m multiline flag doesn't change the dot behavior. So to
match a pattern across multiple lines, the character set [^] can be
used (if you don't mean an old version of IE, of course), it will
match any character including newlines.

例如:

江户十一〔16〕号

*在哪里?是对0个或多个出现的[^]的非贪婪抓取。


dotall修饰符在2018年6月实际变成了javascript,即ecmascript 2018。https://github.com/tc39/proposal-regexp-dotall-flag

1
2
3
4
5
6
7
8
const re = /foo.bar/s; // Or, `const re = new RegExp('foo.bar', 's');`.
re.test('foo
bar'
);
// → true
re.dotAll
// → true
re.flags
// → 's'