標籤:hnu 劃線 更改 尾碼 vbs 郵件 ram 開發 new
元字元
Regex記錄表
元字元
1、 \b : 單詞的開始或結束2、 .* : 任意數量的不包含換行的字元 . : 匹配除分行符號以外的任一字元 3、 \d : 是新的元字元,匹配一位元字 \d{n} : 必須連續重複匹配n次4、 \s : 匹配任意的空白符(空格,製表格,分行符號,中文全形空格等)5、 \w : 匹配字母或者數字或者底線或者漢字等6、 ^ : 匹配字串的開始 ¥ : 匹配字串的結束
注意:
* 字元轉義 如果你想尋找元字元本身,比如.和* ,這時候你就應該使用\.和\*
重複
代碼 |
說明 |
* |
重複零次或更多次 |
+ |
重複一次或更多次 |
? |
重複零次或一次 |
{n} |
重複n次 |
{n,} |
重複n次或更多次 |
{n,m} |
重複n到m次 |
注意:
*字元類如果想匹配沒有預定義的元字元集合,比如a,e,o。這時候你就要[aeo]就匹配任何一個英文母音的字母。[.?!]匹配任意一個標點符號
分枝條件
滿足任意一種規則都應該當成匹配,用 | 把不同的規則分割開來
0\d{2}-\d{8}|0\d{3}-\d{7} 這個運算式能匹配兩種以連字號分隔的電話號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445) \(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}這個運算式匹配3位區號的電話號碼,其中區號可以用小括弧括起來,也可以不用,區號與本地號間可以用連字號或空格間隔,也可以沒有間隔
使用分枝條件時,要注意個分枝的順序
\d{5}-\d{4}|\d{5} 換成 \d{5}|\d{5}-\d{4},那麼就只會匹配5位的郵編。原因是匹配分枝條件時,將會從左至右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了
重複多個字元,使用分組
(\d{1,3}\.){3}\d{1,3}是一個簡單的IP地址匹配運算式(\d{1,3}\.){3}匹配三位元字加上一個英文句號(這個整體也就是這個分組)重複3次,最後再加上一個一到三位的數字(\d{1,3})不幸的是,它也將匹配256.300.888.999這種不可能存在的IP地址((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。解析正確IP:01-09,0-2551. 2[0-4]\d :(200-249)2. 25[0-5] :(250-255)3. [01]?\d\d? : (01-09,0-199)
反義
代碼 |
文法 |
\W |
匹配任意不是字母,數字,底線,漢字的字元 |
\S |
匹配任意不是空白符的字元 |
\D |
匹配任意非數位字元 |
\B |
匹配不是單詞開頭或結束的位置 |
[^x] |
匹配除了x以外的任一字元 |
[^aeiou] |
匹配除了aeiou這幾個字母以外的任一字元 |
例如: \S+匹配不包含空白符的字串。 <a[^>]+>匹配用角括弧括起來的以a開頭的字串
後向引用
常用分組文法
分類 |
代碼/文法 |
說明 |
捕獲 |
(exp) |
匹配exp,並捕獲文本到自動命名的組裡 |
|
(?exp |
匹配exp,並捕獲文本到名稱為name的組裡,也可以寫成(?‘name‘exp) |
|
(?:exp) |
匹配exp,不捕獲匹配的文本,也不給此分組分配組號 |
零寬斷言 |
(?=exp) |
匹配exp前面的位置 |
|
(?<=exp) |
匹配exp後面的位置 |
|
(?!exp) |
匹配後面跟的不是exp的位置 |
|
(?<!exp) |
匹配前面不是exp的位置 |
注釋 |
(?#comment) |
這種類型的分組不對Regex的處理產生任何影響,用於提供注釋讓人閱讀 |
注意:
分組0對應整個Regex實際上組號分配過程是要從左向右掃描兩遍的:第一遍只給未命名組分配,第二遍只給命名組分配--因此所有命名組的組號都大於未命名的組號你可以使用(?:exp)這樣的文法來剝奪一個分組對組號分配的參與權
例如:
\b(\w+)\b\s+\1\b可以用來匹配重複的單詞:html html
零寬斷言
<?!w+> ?<!w+ \b\w*q[^u]\w*\b匹配包含後面不是字母u的字母q的單詞。 你會發現,如果q出現在單詞的結尾的話,像Iraq,Benq,這個運算式就會出錯。這是因為[^u]總要匹配一個字元,所以如果q是單詞的最後一個字元的話,後面的[^u]將會匹配q後面的單詞分隔字元(可能是空格,或者是句號或其它的什麼),後面的\w*\b將會匹配下一個單詞,於是\b\w*q[^u]\w*\b就能匹配整個Iraq fighting 負向零寬斷言能解決這樣的問題,因為它只匹配一個位置,並不消費任何字元。現在,我們可以這樣來解決這個問題:\b\w*q(?!u)\w*\b例如\d{3}(?!\d)匹配三位元字,而且這三位元字的後面不能是數字;\b((?!abc)\w)+\b匹配不包含連續字串abc的單詞。(?<![a-z])\d{7}匹配前面不是小寫字母的七位元字。(?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單HTML標籤內裡的內容:被角括弧括起來的單詞(比如可能是<b>),然後是.*(任意的字串),最後是一個尾碼(?=<\/\1>)。注意尾碼裡的\/,它用到了前面提過的字元轉義;\1則是一個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內容,這樣如果首碼實際上是<b>的話,尾碼就是</b>了。整個運算式匹配的是<b>和</b>之間的內容(再次提醒,不包括首碼和尾碼本身)
注釋
代碼 |
文法 |
(?<= |
# 斷言要匹配的文本的首碼 |
<(\w+)> |
# 尋找角括弧括起來的字母或數字(即HTML/XML標籤) |
( |
# 首碼結束 |
.* |
# 匹配任意文本 |
(?= |
# 斷言要匹配的文本的尾碼 |
<\ / \1> |
# 尋找角括弧括起來的內容:前面是一個"/",後面是先前捕獲的標籤 |
) |
# 尾碼結束 |
例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。
貪婪和懶惰
a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,通常的行為是(在使整個運算式能得到匹配的前提下)匹配儘可能多的字元。它會匹配整個字串aabab。這被稱為貪婪匹配
a.*?b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,匹配任意數量的重複,(但是在能使整個匹配成功的前提下)使用最少的重複,會匹配aab和ab。這被稱為懶惰匹配
注意:
為什麼第一個匹配是aab(第一到第三個字元)而不是ab(第二到第三個字元)?簡單地說,因為Regex有另一條規則,比懶惰/貪婪規則的優先順序更高:最先開始的匹配擁有最高的優先權
懶惰限定符
代碼 |
說明 |
*? |
重複任意次,但儘可能少重複 |
+? |
重複1次或更多次,但儘可能少重複 |
?? |
重複0次或1次,但儘可能少重複 |
{n,m}? |
重複n到m次,但儘可能少重複 |
{n,}? |
重複n次以上,但儘可能少重複 |
處理選項
注意:
Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);
常用的處理選項
名稱 |
說明 |
IgnoreCase |
匹配時不區分大小寫 |
Multiline |
更改^和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個字串的開頭和結尾匹配。(在此模式下,$的精確含意是:匹配\n之前的位置以及字串結束前的位置.) |
Singleline |
更改.的含義,使它與每一個字元匹配(包括分行符號\n) |
IgnorePatternWhitespace |
忽略運算式中的非轉義空白並啟用由#標記的注釋。 |
ExplicitCapture |
僅捕獲已被顯式命名的組。 |
常用案例
說明 |
Regex |
網址(url) |
[a-zA-z]+://[^\s]* |
IP地址 |
((2[0-4]\d |
電子郵件(email) |
\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)* |
QQ號碼 |
[1-9]\d{4,} |
HTML標籤 |
<(.)(.)>.*<\/\1> |
密碼(有數字/大寫字母/小寫字母/標點,8位以上) |
(?=^.{8,}$)(?=.\d)(?=.\W+)(?=.[A-Z])(?=.[a-z])(?!.\n).$ |
日期 |
(\d{4} |
漢字 |
[\u4e00-\u9fa5] |
中文及全形標點符號 |
[\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee] |
注意:
ios 開發使用 RegexKit.framework 架構
使用規則:
暱稱驗證:(4-8)位漢字 + (BOOL) validateNickname:(NSString *)nickname{ NSString *nicknameRegex = @"^[\u4e00-\u9fa5]{4,8}$"; NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",nicknameRegex]; return [passWordPredicate evaluateWithObject:nickname];}密碼驗證:(6-20)位英文不分大小寫和數字+ (BOOL) validatePassword:(NSString *)passWord{ NSString *passWordRegex = @"^[a-zA-Z0-9]{6,20}+$"; NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",passWordRegex]; return [passWordPredicate evaluateWithObject:passWord];}郵箱驗證:+ (BOOL) validateEmail:(NSString *)email{ NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; return [emailTest evaluateWithObject:email];
}
iOS 玩轉正則運算