比如匹配至少不能全是大寫字母或者全是小寫字母或者全是數(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ò)人氣名人講師,...
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>