問題
假設(shè)我開了一個創(chuàng)業(yè)公司,現(xiàn)在邀請一批老伙伴加入公司租冠,一起吃餅鹏倘。這時候我收到了這些回復:
- ok, i will do it
- okie dokie
- Ahooy, Okay!!!
- why sure, i can go
- arrr, yes matey
- My answer me mate, is yes y
現(xiàn)在我要找到回復中肯定的詞語。比如
- ok
- Okay
- sure
- yes
- y
應該怎么做呢顽爹?
單詞邊界
從最簡單的開始纤泵,先匹配ok。
/ok/
結(jié)果第二行的okie也被匹配了话原,這是什么鬼夕吻,我們不應該匹配第2行。還記得《正則表達式2》里面講的部分匹配的問題繁仁,但是這里不能用那個解決方案涉馅,因為ok后面還有很多東西呢。所以這里介紹一個邊界元字符(Boundary metacharacter)\b
黄虱。
這樣寫就可以正確匹配ok單詞了
/\bok\b/
\b
確保匹配整個單詞
匹配多個和“可以選擇的”
現(xiàn)在ok匹配上了稚矿,我們需要匹配Okay了。直接把Okay放在后面可以的捻浦。
/\bok\b|\bokay\b/
這樣可以的晤揣。但是如果有更多的可能性呢,這樣就不好了朱灿,我們換一種吧昧识。如果能讓ay
是可選的,就可以簡化了吧盗扒。這里介紹?
.看看下面代碼
/\bok(ay)?\b/i
這樣就可以匹配ok和okay了跪楞,?
表示出現(xiàn)0次或者1次,就是可以選擇的意思
Or破壞了單詞邊界
下面我們來看看如何匹配sure侣灶,很顯然可以想到甸祭。
/\bok(ay)?|sure\b/i
這個可以匹配sure,可是也可以匹配ensure褥影,因為左邊沒有\b
了池户。解決的方法是用group
/\b(ok(ay)?|sure)\b/i
結(jié)局
剩下的yes和y應該很好解決了,看一下代碼吧
/\b(ok(ay)?|sure|y(es)?)\b/i
獎勵
正則表達式太牛逼了凡怎,忍不住我再學習點校焦。
如何表達非
前面我們都是去匹配,那么我們不想匹配一些東西怎么辦统倒,比如斟湃,要匹配所有不是數(shù)字的?看看這個:
/[a-z\s,]+/i
這樣寫不錯檐薯,但是還可以這樣
/[^\d]+/i
等等凝赛,^
不是表示一行以模式開頭嗎注暗?嗯,在[]中它表示否定墓猎。不要混淆了捆昏。/^[^\d]+$/
看這個里面兩個^
是不同的意思。
相反意思的元字符
元字符 | 描述 |
---|---|
\w | 查找單詞字符 |
\W | 查找非單詞字符 |
\d | 查找數(shù)字 |
\D | 查找非數(shù)字字符 |
\b | 匹配單詞邊界 |
\B | 匹配非單詞邊界 |
呵呵毙沾,其實直接用/^\D+$/
就可以查找所有非數(shù)字了骗卜。
限制數(shù)字
我們知道[]
里面的表達式只能匹配一個字符,?
表示出現(xiàn)0次或者1次左胞,就是可以選擇的意思寇仓,+
表示出現(xiàn)1次或者大于1次,那么有沒有其他的量詞呢:
量詞 | 描述 |
---|---|
n+ | 匹配任何包含至少一個 n 的字符串烤宙。 |
n* | 匹配任何包含零個或多個 n 的字符串遍烦。 |
n? | 匹配任何包含零個或一個 n 的字符串。 |
n{X} | 匹配包含 X 個 n 的序列的字符串躺枕。 |
n{X,Y} | 匹配包含 X 或 Y 個 n 的序列的字符串服猪。 |
n{X,} | 匹配包含至少 X 個 n 的序列的字符串。 |
n$ | 匹配任何結(jié)尾為 n 的字符串拐云。 |
^n | 匹配任何開頭為 n 的字符串罢猪。 |
?=n | 匹配任何其后緊接指定字符串 n 的字符串。 |
?!n | 匹配任何其后沒有緊接指定字符串 n 的字符串叉瘩。 |
舉個例子吧:
/[a-z]{1,3}/
上面這個表達式可以匹配:'t','te','tes'
膳帕,但是'test'
就不能匹配了,最多1個祖父到三個字符薇缅。
語法
{最少匹配的數(shù)目, 最多匹配的數(shù)目}