遇到了奇怪的行为,否定的字符类在没有提供
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'
在你的第一个正则表达式模式中:
b[^z]+
最后一个术语
[^z]+
将匹配除 z
之外的任何字符,其中包括所有其他字符 包括 空格和换行符。
作为旁注,如果我们希望
.*
在没有可用的全点模式时跨换行符匹配,我们可以使用 [\s\S]*
,它使用与第一个模式类似的逻辑进行操作。