// 从头说起:
// 我能简单的理解正则的“前瞻”,下面语句查询了一个:右侧紧邻数字的字母
// 即匹配字母([a-z]),且它的右边必须得是数字\d
'a123, b汉字, c★★'.match(/[a-z](?=\d)/g);
// ["a"]
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'你好,你好,世界'.match( /(?!你)[\u4e00-\u9fa5]/g );
//["好", "好", "世", "界"]
// ▲但上边这个正则我没看懂
// 请问1:这把个 (?!你) 放在表达式头部是啥意思?
// 请问2:这个 (?!你)[\u4e00-\u9fa5] 为啥能表示 非“你”的汉字
谢谢老司机指南,感谢帮助!3Q
-
[\u4e00-\u9fa5]
代表unicode编码规范汉字集合(?!pattern)
代表一个正向否定预检(?!你)
代表你匹配的内容不包括 "你" 这个字(?!你)[\u4e00-\u9fa5]
就代表匹配所有的 非"你" 汉字了=============以上是之前的回答,但是感觉有些知识盲点,有必要深究一番,于是有了下面答案==================
[\u4e00-\u9fa5]
代表unicode编码规范汉字集合这个集合的由来,摘出引用文档的关键几句话:
所以重点就是
0x4E00–0x9FA5代表汉字编码范围
。(?!pattern)
代表一个正向否定预检但这是一个预检匹配(或者叫零宽断言),预检匹配到的内容是不会被作为整个正则匹配的结果的,是一个匹配条件,为的是匹配出更准确的结果。
这个正向否定预检怎么玩呢?
比如:
放在后面正向断言Windows字符串后面不能跟一些字符,否则就不匹配这个Windows。
那么是不是,"(?!windows)PC" 能匹配"macPC"中的"PC",但不能匹配"WindowsPC"中的"PC"
看看结果:
事实上,"(?!windows)PC" 能匹配"macPC"中的"PC",但也能匹配"WindowsPC"中的"PC"
这又是为什么呢?
这我们要从
(?!pattern)
这个正则表达式来说说:引用正则表达式的先行断言(lookahead)和后行断言(lookbehind) 中的说明:
原来(?!pattern)它的含义是匹配了一个位置。
'你好,你好吗,世界你'.match( /(?!\s)/g )
就代表了我要匹配全部(匹配全部是因为带了g标识)非空(s代表所有的空字符)字符的位置可以看到
'你好,你好吗,世界你'
正好10个长度,但是位置有11个,也就是我们匹配到数组有11个元素原因,数组中的元素是空字符是因为匹配的结果是位置,没有具体的字符,用11个空字符来表示11个位置。'你好,你好吗,世界你'这个字符串有
'[1]你[2]好[3],[4]你[5]好[6]吗[7],[8]世[9]界[10]你[11]'
11个位置。那像题主遇到的以
(?!你)
开始的匹配又代表什么意思呢?这代表去除"你"这个字生成的位置, 去掉三个"你"的三个位置,就剩下8个位置了。
回到题主的问题
'你好,你好吗,世界你'.match( /(?!你)[\u4e00-\u9fa5]/g )
'你好,你好吗,世界你'.match( /(?!你)/g )
匹配到了2,3,5,6,7,8,9,11这8个位置
'你好,你好吗,世界你'.match( /(?!你)[\u4e00-\u9fa5]/g )
(?!你)的位置匹配并不会作为结果被获取,而是作为其他匹配的条件
[\u4e00-\u9fa5]
的匹配能够匹配到所有汉字字符(?!你)[\u4e00-\u9fa5]
匹配就代表匹配了上面的(?!你)
匹配到8个位置后面紧跟的汉字字符。'[1]你[2]好[3],[4]你[5]好[6]吗[7],[8]世[9]界[10]你[11]'
的2,3,5,6,7,8,9,11这8个位置中,只有2,5,6,8,9这五个位置后面的字符有效这也就是答案了。