为了账号安全,请及时绑定邮箱和手机立即绑定

如何理解下面语句?

'a1a2a3a6a4a5'.replace(/\w(?=\d)/g ,'X')按照老师的思路可以得出来的是"X1X2X3X6X4X5"。

为什么  'a1a2a3a6a4a5'.replace(/(?=\d)\w/g,'X')  得出来的是  "aXaXaXaXaXaX"  ?如何去理解?

我暂时只能理解为  /(?=\d)\w/g'X'  与  /\w(?!\d)/g,'X'  是一样的

正在回答

3 回答

首先正则表达式的前瞻表达是正向前瞻:exp(?=assert)或负向前瞻:exp(?!assert);正则表达式必须在前面,没有(?=\d)\w/g这种表达方式,至于能输出结果是因为浏览器会自动把前瞻表达式的格式向后移动,纠正成正确的表达式\d(?=\w)/g;所以'a1a2a3a6a4a5'.replace(/\w(?=\d)/g ,'X')==='a1a2a3a6a4a5'.replace(/\d(?=\w)/g ,'X'),至于等于'a1a2a3a6a4a5'.replace(/\w(?!\d)/g,'X' )是碰巧;不信可以试下下面的例子:

'ab1ab2ab3ab6ab4ab5'.replace(/\w\w(?=\d)/g ,'X')

"X1X2X3X6X4X5"

移动前面错误的写法就是:

'ab1ab2ab3ab6ab4ab5'.replace(/(?=\d)\w\w/g ,'X')

"abXbXbXbXbXb5"

浏览器自动纠正为:

'ab1ab2ab3ab6ab4ab5'.replace(/\d\w(?=\w)/g ,'X')

"abXbXbXbXbXb5"

与你想的和负向前瞻相等是错误的:

'ab1ab2ab3ab6ab4ab5'.replace(/\w\w(?!\d)/g ,'X')

"aXaXaXaXaXaX"

自己思考下。


1 回复 有任何疑惑可以回复我~
#1

超速飛 提问者

非常感谢!受益匪浅
2017-05-27 回复 有任何疑惑可以回复我~
#2

超速飛 提问者

纠正一下错误 'a1a2a3a6a4a5'.replace(/\w(?=\d)/g ,'X')==='a1a2a3a6a4a5'.replace(/\d(?=\w)/g ,'X'),这个是不想等的。 应该改为'a1a2a3a6a4a5'.replace(/(?=\d)\w/g ,'X')==='a1a2a3a6a4a5'.replace(/\d(?=\w)/g ,'X'),
2017-05-27 回复 有任何疑惑可以回复我~
#3

调皮的魔法少女李狗蛋儿 回复 超速飛 提问者

我在浏览器复制了'a1a2a3a6a4a5'.replace(/(?=\d)\w/g ,'X')==='a1a2a3a6a4a5'.replace(/\d(?=\w)/g ,'X')是false
2017-12-09 回复 有任何疑惑可以回复我~

正则表达式必须在前面,没有(?=\d)\w/g这种表达方式,至于能输出结果是因为浏览器会自动把前瞻表达式的格式向后移动,纠正成正确的表达式\d(?=\w)/g; 这样理解也有问题啊

'a1a2a3a6a4a5'.replace(/(?=\d)\w/g,'X')的结果是"aXaXaXaXaXaX"

'a1a2a3a6a4a5'.replace(/\d(?=\w)/g,'X')的结果是"aXaXaXaXaXa5"

两次的结果是不一致的。

0 回复 有任何疑惑可以回复我~
#1

qq_慕勒5154997

"预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。"http://www.runoob.com/regexp/regexp-metachar.html 位置 1 2 3 4 5 6 7 8 9 10 11 12 a 1 a 2 a 3 a 6 a 4 a 5 /(?=\d)\w/g中,(?=\d)搜索到了第2个字符,但因为之前并没有表达式所以, 搜索位置停在了第二个位置上,之后的\w匹配到了第二个位置的数字,结果就是把第二个位置的数字替换了 仅个人理解,如不正确,请相互讨论
2018-12-06 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JavaScript正则表达式
  • 参与学习       96822    人
  • 解答问题       119    个

JavaScript正则表达式教程,理解之后,正则表达式比你想象的简单

进入课程

如何理解下面语句?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信