为什么即使禁用多行模式,JavaScript 正则表达式中的否定字符类也会遍历换行符

问题描述 投票:0回答:1

遇到了奇怪的行为,否定的字符类在没有提供

m/multiline
的情况下遍历换行符。

> node
Welcome to Node.js v22.7.0.
Type ".help" for more information.
> 'abc\nabc\nabc\n'.replace(/b[^z]+/g, '')
'a'
> 'abc\nabc\nabc\n'.replace(/b[^z\n]+/g, '')
'a\na\na\n'

我预计第一个结果只会是当启用

m
multiline
标志
时的情况:

> 'abc\nabc\nabc\n'.replace(/b[^z]+/gm, '')
'a'

这是一个错误,还是预期的结果?如果是预期的话,原因是什么?

最后我能够通过使用

?$
来解决这个问题:

> 'abc\nabc\nabc\n'.replace(/b[^z]+?$/g, '')
'a'
> 'abc\nabc\nabc\n'.replace(/b[^z]+?$/gm, '')
'a\na\na\n'
javascript regex
1个回答
1
投票

在你的第一个正则表达式模式中:

b[^z]+

最后一个术语

[^z]+
将匹配除
z
之外的任何字符,其中包括所有其他字符 包括 空格和换行符。

作为旁注,如果我们希望

.*
在没有可用的全点模式时跨换行符匹配,我们可以使用
[\s\S]*
,它使用与第一个模式类似的逻辑进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.