鍍金池/ 問(wèn)答/Java  PHP  HTML/ 如何正則匹配到 12-128 ,而不會(huì)匹配到129的前兩位12?

如何正則匹配到 12-128 ,而不會(huì)匹配到129的前兩位12?

在嘗試使用正則匹配 12-128 時(shí),發(fā)現(xiàn)可以匹配到129,如題。

/ 192.168.0.(12[0-8]|1[0-1][0-9]|[2-9][0-9]|1[2-9]) /

匹配 129 時(shí)返回true。
判斷 255 也會(huì)匹配到前兩位 25。

如何能避免此類情況出現(xiàn)?

或者是用其他寫(xiě)法?

回答
編輯回答
尕筱澄

對(duì)數(shù)字區(qū)間通常是分段寫(xiě)正則,例如12-128,分成:12-19, 20-99, 100-119,120-128:/^((1[2-9])|([2-9][0-9])|(1[01][0-9])|(12[0-8]))$/

對(duì)于更復(fù)雜的,還是直接提取數(shù)字,然后if/else判斷吧,簡(jiǎn)單的正則+簡(jiǎn)單的判斷總比復(fù)雜的正則好。

2017年2月12日 22:44
編輯回答
毀憶

這種需求建議就不要用正則實(shí)現(xiàn),直接用正則粗略過(guò)濾是個(gè)正整數(shù),然后再轉(zhuǎn)成整數(shù)判斷一下大小就行了,反正js在前端執(zhí)行,這個(gè)速度又不會(huì)太慢,還容易維護(hù),你覺(jué)得你寫(xiě)個(gè)這個(gè)正則后面你自己還能看得懂嗎?

EDIT,沒(méi)細(xì)看你的需求,你這個(gè)需求完全不應(yīng)該用正則去實(shí)現(xiàn),而應(yīng)該直接用ipv4的解析類庫(kù)去搞,直接限定ip段豈不美哉?

2017年1月14日 17:59
編輯回答
背叛者
/192.168.0.(12[0-8]|1[0-1][0-9]|[2-9][0-9]|1[2-9])/

這個(gè)正則的意思是只要測(cè)試的字符串里面存在一個(gè)子字符串使得這個(gè)正則匹配,那么就會(huì)返回true,所以當(dāng)你使用'192.168.0.129'去測(cè)試的時(shí)候,因?yàn)樽幼址?code>192.168.0.12是滿足要求的,所以測(cè)試結(jié)果是true。

所以想要避免這種情況,需要在正則的開(kāi)始添加^,在正則的最后添加$。
^匹配字符串的開(kāi)頭,匹配的是一個(gè)位置;
$匹配字符串的結(jié)尾,匹配的是一個(gè)位置;

/^192.168.0.(12[0-8]|1[0-1][0-9]|[2-9][0-9]|1[2-9])$/

加上^ $的正則的意思是,這個(gè)字符串要整個(gè)匹配這個(gè)表達(dá)式,而不是其中的某個(gè)子串匹配就可以。這個(gè)時(shí)候測(cè)試'192.168.0.129'就會(huì)返回false了.

如果你的需求就是判斷子串中是否有匹配的情況,那么你可以簡(jiǎn)單的在后面添加一個(gè)斷言,使得后面的字符不是數(shù)字:

/192.168.0.(12[0-8]|1[0-1][0-9]|[2-9][0-9]|1[2-9])(?![0-9])/
2017年11月23日 10:04