亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

正則正向否定匹配怎么用?
高洛峰
高洛峰 2016-11-10 16:51:12
0
4
920

比如匹配至少不能全是大寫字母或者全是小寫字母或者全是數(shù)字

(?!^[A-Z]+$|^[a-z]+$|^[0-9]+$)^\S+$

問什么不能使用呢


高洛峰
高洛峰

擁有18年軟件開發(fā)和IT教學(xué)經(jīng)驗。曾任多家上市公司技術(shù)總監(jiān)、架構(gòu)師、項目經(jīng)理、高級軟件工程師等職務(wù)。 網(wǎng)絡(luò)人氣名人講師,...

全部回覆(4)
學(xué)霸

UPDATE: 之前的補(bǔ)充可能不對。
/(?!)/這類斷言的不實際匹配字符,常常是組合式使用的。舉例
/(.*)(?!00$)/以00結(jié)尾的字符,貌似反義的(?!)不被支持。

請忽略下面的補(bǔ)充吧,我也不刪除了。說說題主的正則的可能的問題

reg?=?/(?!^[A-Z]+$|^[a-z]+$|^[0-9]+$)/
reg.test("11")?//true

//修改后
reg?=?/^(?![A-Z]+$|[a-z]+$|[0-9]+)$/
reg.test("11")?//false
reg.test("1a")?//true

回答題主的另外一個問題,
請問一下,正想否定匹配不是不消耗字符嗎,為什么這樣可以呢
我做了簡單實驗,首先

var?re1?=?/(^\d$|^[a-z]$)/;?//分支形式,匹配一個數(shù)字或者一個小寫字母
re1.test("1");
re1.test("a");
re1.test("1a");?//?false
//以上結(jié)果如我們所愿的

然后是否定的分支

var?re2?=?/(?!^\d$|^[a-z]$)/;
re2.test("1");?//true
re2.test("aaa");?//true
re2.test("1111");?//true
re2.test("?");?//true

其實這是一個語法上的問題,上面的分支其實是由/(?!^\d$)/和/^[a-z]$/組成的。
但我在這里強(qiáng)烈建議不要寫出/(?!^\d$)/這樣的正則出來
因為它能匹配任意字符,任意長度的。
因為它是斷言不實際匹配字符,或者說匹配某個位置,要找出不是/^\d$/這樣的位置出來太簡單了。
假設(shè)^.*$這樣的字符串,只要在$的位置去match上面的/^\d$/當(dāng)然是不會匹配的啦。

那么正確的寫法應(yīng)該怎樣的呢?

var?re3?=?/(?!(^\d$|^[a-z]$))./;
re3.test("1");?//?false
re3.test("a");?//?false
re3.test("?");?//true

這樣組合式的寫法也有它的問題,整個正則限制了只能匹配一個字符,這個字符不是能是數(shù)字和小寫字母。

進(jìn)一步看,明白了(?!)的語法,是可以對^和$做適當(dāng)?shù)奶崛〉摹?/p>


三叔

聽起來像是用來檢測密碼復(fù)雜度的。python 字符串內(nèi)置方法isupper islower isdigit

學(xué)霸

(?!1+$|2+$|3+$)^S+$

A-Z ?

a-z ?

0-9 ?


三叔

試試這個[a-zA-Z0-9]*呢

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板