这是使用了肯定前瞻进行了匹配吧,首先正则表达式是\w(?=\d),匹配的是一个单词字符,而assert部分筛选的是单词字符向字符串尾部方向的数字字符,这样就很明显了,本身又是单词字符,后面连接的还是数字字符的只有"a",所以只会把"a"replace成”x“。
\w 匹配包括下划线的任何单词字符等价于’[A-Za-z0-9_]’
要先了解题目的意思,目的是要做什么?
题目的意思为:负向前瞻,替代的条件是满足\ w前詹为非0-9的所有替换为X
所以,要按照整体顺序
a后面跟的是2 不满足为:a,2后为* 满足为:x,*后为3,不满足 为*,3后为4,不满足 3,
如上所述,按照顺序最后一个v为空,符合条件,即为x,答案为aX*3XXX,
“正则表达式是从文本头部向尾部解析”。这就像在走路,没走过的路在你的前面,需要你往前看(前瞻);走过的路需要你回头看(后顾)
最后一个‘v'后面不是数字,是一个位置,那前面但呢?照你这么说,前面那个v后面是一个位置阿
首先正则表达式的前瞻表达是正向前瞻: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"
自己思考下。
/\d(?=[a-z][A-Z]\d)/ 其实多个前瞻可以合成一个前瞻的
你那个有一个地方错了 你用那个网站看一下效果图会发现可以为0次 就是你不应该写 .* 的
去掉 .* 之后好像还是有问题 可能是js不支持多个前瞻吧
\w等价于[a-zA-Z_0-9],含义是单词字符(字母、数字下划线)。3属于\w,v也属于\w,所以能匹配上。
var reg=/(\d)([a-z])/g; var str='a1b2*dw'; alert(str.replace(reg,'&$2'));