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标志,它都会给我正确的结果。
我的瑞格鞋怎么了?
您正在查找
坏消息是它在javascript中不存在(从ES2018开始,见下文)。好消息是,您可以使用一个字符类(如
1 | [\s\S] |
所以在你的例子中,regex会变成:
1 | /[\s\S]*([^<]+?)<\/h1>/i |
号
截至ES2018年,javascript支持EDOCX1(dotall)标志,因此在现代环境中,您的正则表达式可以是您编写的那样,但末尾有
1 | /.*([^<]+?)<\/h1>/is |
您需要
在Nodejs6.11.3中,
(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' |
。