正則表達(dá)式匹配"非"

首先,正則表達(dá)式的"非",代表不想匹配某個(gè)字符。
比如字符串 helloword123,/[^0-9]+/g?可以匹配非數(shù)字,即匹配結(jié)果為 helloword;
同樣的,/[^he]+/g?可以匹配非?h?非?e?的字符,匹配結(jié)果為 lloword123;
那么?/[^hello]/g?呢?乍一看可能會(huì)以為能匹配 word123,其實(shí)不然,[^]?內(nèi)的多個(gè)字符是"或"的關(guān)系存在的,即它們并不是一個(gè)整體,/[^hello]/g?表示 非?h?非?e?非?l?非?o,并不能理解為 非(hello),所以匹配結(jié)果是 w 和 rd123。
道理我們都懂,可我們就是想匹配非某個(gè)字符串呢?比如某一字符串若是含有 hello 則無匹配,若是不含 hello 則匹配,寫成?[^hello]?是顯然不行的,[^(hello)]?呢?其實(shí)不起作用。
這時(shí)我們需要用到正則表達(dá)式的斷言——?(?!pattern)?零寬負(fù)向先行斷言 或者?(??零寬負(fù)向后行斷言 均可。
零寬斷言是正則表達(dá)式中的難點(diǎn),所以重點(diǎn)從匹配原理方面進(jìn)行分析。零寬斷言還有其他的名稱,例如"環(huán)視"或者"預(yù)搜索"等等,不過這些都不是我們關(guān)注的重點(diǎn)。
這里只介紹一種寫法,大家可以都去嘗試一下。
/^((?!hello).)+$/由于斷言?(?!hello)?是不占位的,后跟的 . 在原位置匹配任意字符,再用括號(hào)將其括起來,用?+?重復(fù)一次或多次,前后加上?^?和?$,若是字符串中存在 hello,則匹配到 h 字符之前的時(shí)候,斷言?(?!hello)?匹配失敗,正則匹配結(jié)果為 false, 若是字符串中不存在 hello,則匹配結(jié)果是整個(gè)字符串。
用法實(shí)戰(zhàn)
1、匹配?&?和?;?之間不含有 test 的字符
str = "hello &test1;test&qout;";正則表達(dá)式:
/&((?!test).)+;/g匹配結(jié)果: ?和?&qout;
2、匹配不含有??標(biāo)簽的??標(biāo)簽
str?=?"<div?id='1'><img?class='xx'>div><div?id='1'><input?type='text'>div>";正則表達(dá)式:
/<div[^>]*>((?!<img[^>]*>).)+div>/g匹配結(jié)果:
<div?id='1'><input?type='text'>div>