iOS 玩轉正則運算

來源:互聯網
上載者:User

標籤: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]就匹配任何一個英文母音的字母。[.?!]匹配任意一個標點符號
分枝條件
  1. 滿足任意一種規則都應該當成匹配,用 | 把不同的規則分割開來

    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位區號的電話號碼,其中區號可以用小括弧括起來,也可以不用,區號與本地號間可以用連字號或空格間隔,也可以沒有間隔
  2. 使用分枝條件時,要注意個分枝的順序

     \d{5}-\d{4}|\d{5} 換成 \d{5}|\d{5}-\d{4},那麼就只會匹配5位的郵編。原因是匹配分枝條件時,將會從左至右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了
  3. 重複多個字元,使用分組

    (\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)。
貪婪和懶惰
  1. a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,通常的行為是(在使整個運算式能得到匹配的前提下)匹配儘可能多的字元。它會匹配整個字串aabab。這被稱為貪婪匹配

  2. a.*?b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,匹配任意數量的重複,(但是在能使整個匹配成功的前提下)使用最少的重複,會匹配aab和ab。這被稱為懶惰匹配

    注意:

    為什麼第一個匹配是aab(第一到第三個字元)而不是ab(第二到第三個字元)?簡單地說,因為Regex有另一條規則,比懶惰/貪婪規則的優先順序更高:最先開始的匹配擁有最高的優先權
  3. 懶惰限定符

    代碼 說明
    *? 重複任意次,但儘可能少重複
    +? 重複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 玩轉正則運算

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.