標題
正規表示式(三)dragontt(原作)
關鍵字正規表示式
前面的文章中,介紹了正規表示式的基本語法,以及一些簡單的例子。但這些並不是我們會遇到的全部問題,有些時候我們不得不編寫一些較為複雜的正規表示式來解決我們的實際問題。
這裡,我先提幾個問題,然後,我們逐個運用正規表示式的知識來解決。
1.符合兩種條件之一,都成立,例如:是純數字或者純字元
123(
true
),hello(true),234.test23(false)
2.要得到不以數字開頭的字元組合
如:how2234do>you234do,
希望得到
how和
you而不是
do,do
3.得到以數字開頭的字元組合
上例中,得到do和
do4.
要得到不以數字結尾的字元組合
還是上面的情況,要得到的是
ho,do,yo,do
5.得到以數字結尾的字元組合
同上例,得到
ho,do,yo,do
6.不允許字元中
ab同時出現
例:nihaoma(true),above(false),agoodboy(true)
下面我們開始著手解決這些問題:
第乙個:符合兩種條件之一,都成立
這種要求可能代表著一種普遍的要求,我們先來看看這個表
替換構造
定義
|
與由|(垂直條)字元分隔的術語中的任何乙個術語匹配;例如 cat|dog|tiger。使用最左側的成功匹配。
(?(expression)yes|no)
如果表示式在此位置匹配,則與「yes」部分匹配;否則,與「no」部分匹配。「no」部分可省略。表示式可以是任何有效的表示式,但它將變為零寬度斷言,因此該語法等效於 (?(?=expression)yes|no)。請注意,如果表示式是命名組的名稱或捕獲組編號,則替換構造將解釋為捕獲測試(在本表的下一行對此進行了描述)。若要避免在這些情況下產生混淆,則可以顯式拼出內部 (?=expression)。
(?(name)yes|no)
如果命名捕獲字串有匹配,則與「yes」部分匹配;否則,與「no」部分匹配。「no」部分可省略。如果給定的名稱不與此表示式中使用的捕獲組的名稱或編號對應,則替換構造將解釋為表示式測試(在本表的上一行進行了描述)。
(ms-help:
)在這個表中,我們看到,正則中為了解決這一類問題,定義了
|來表示或者的關係,就好像常見的或運算子一樣,現在我們來看看如何利用
|來解決我們的問題。
1.先為可選擇的表示式撰寫表示式:
a)純數字
– [0-9]*
b)純字母
– [a-za-z]*
2.將可選條件用
|連線起來就是我們所需的
^[0-9]*$|^[a-za-z]*$
(這裡我特別對兩個條件加上了^和
$限定符,這在驗證字串是否完全符合要求時,是十分必要的,如果不加這兩個限定符,有興趣的朋友可以自己試一下效果。
後面四個問題,其實是一類的,所以我們把它們放在一起處理。接下來我們來解決第二到第四個問題:
首先,我們回顧一下上次介紹的分組構造:
(?= )
零寬度正**先行斷言。僅當子表示式在此位置的右側匹配時才繼續匹配。例如,/w+(?=/d) 與後跟數字的單詞匹配,而不與該數字匹配。此構造不會回溯。
(?! )
零寬度負**先行斷言。僅當子表示式不在此位置的右側匹配時才繼續匹配。例如,/b(?!un)/w+/b 與不以 un 開頭的單詞匹配。
(?<= )
零寬度正回顧後發斷言。僅當子表示式在此位置的左側匹配時才繼續匹配。例如,(?<=19)99 與跟在 19 後面的 99 的例項匹配。此構造不會回溯。
(?零寬度負回顧後發斷言。僅當子表示式不在此位置的左側匹配時才繼續匹配。
可以看到,這個表的這四種規則,正好可以解決我們的問題。
@_@先解決我們的問題再說:
第二例:要得到不以數字開頭的字元組合
(? (?-- 限定字元的開頭不為數字才匹配
[a-za-z]
–描述匹配2個以上的字母
(注:這是取巧的做法,因為,按照我們的邏輯how2234do>you234do中的兩個do的o字母也是符合的,不過,這不是我們想要的,當然還有其他的解決辦法,可以根據實際的情況來處理,這裡是為了講解這個方法@_@)
第三例:得到以數字開頭的字元組合
(?<=/d)[a-za-z]+
(?<=/d)
–限定為數字開頭的字元才匹配
[a-za-z]+ -- 描述匹配1個或多個字母
第四例:要得到不以數字結尾的字元組合
[a-za-z]+(?!/d)
[a-za-z]+ -- 描述匹配1個或多個字母
(?!/d)
–限定不為數字結尾的字母才匹配
第五例:得到以數字結尾的字元組合
[a-za-z]+(?=/d)
[a-za-z]+ -- 描述匹配1個或多個字母
(?=/d)
–限定為數字結尾的字母才匹配
第六例:不允許字元中ab同時出現
^(?!.*?ab).*$
(?!.*?ab)
–限定不允許出現ab相連的字元
.*-- 任意字元
介紹到這裡,我們這一次提出的問題,也都解決了,例子雖然簡單,不過,再複雜的東西也是建立在簡單的基礎上的。其實寫正規表示式的關鍵就是要善於定製規則,用最簡練正確的話來描述,然後用正規表示式的語法寫出來,就可以了
(@_@)
這就要靠大家多積累經驗了。
正規表示式三
正規表示式通常包含字母文字 literaltext 和元字元 metacharacter 字母文字指的是普通文字如 abcde 可匹配字串中任何包含 abcde 的字串。元字元則更加靈活運用通用的表示式匹配所有符合此表示式規律的字串。c 正規表示式語法一 匹配單個字元 從中選擇乙個字元匹配 中間支援...
正規表示式(三)
目錄 一 子表示式 二 正向預查 三 例項 概念 正規表示式中將小括號包裹的部分稱為子表示式。正規表示式含有子表示式時,執行match 正規表示式不能帶修飾符g 或exec方法時,所有子表示式的匹配字串會作為乙個個陣列元素插入到返回結果的末尾。var str abcdefg var reg a bc...
正規表示式 三
能夠於 多種字元 匹配的表示式 正規表示式中的一些表達方法,可以匹配 多個字元 其中的任意乙個字元,比如,表示式 d 可以匹配任意乙個數字。雖然可以匹配其中任意字元,但是只能是乙個,不是多個,這就好比撲克牌時候,大熊澳網可以代替任意一張牌,但是只能代替一張牌。匹配多種字元 1 表示式可匹配 d任意乙...