qqjianyue代碼工

          砌java代碼
          posts - 62, comments - 9, trackbacks - 0, articles - 10
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          正則表達式 規則

          Posted on 2008-10-04 20:00 Qzi 閱讀(811) 評論(0)  編輯  收藏

          30分鐘正則表達式入門的歸納版,原網頁:正則表達式30分鐘入門

          元字符

          \w 匹配字母或數字或下劃線或漢字等。等效于Unicode字符類別 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。如果用ECMAScript選項指定了符合 ECMAScript的行為,則\w只等效于[a-zA-Z_0-9]

          \b 單詞的開頭或結尾,如果需要更精確的說法,\b匹配這樣的位置:它的前一個字符和后一個字符不全是\w

          . 除換行符以外的所有字符

          * 表示數量,任意數量,所以 .* 加起來就表示除換行符以外的任意數量字符,\w*表示任意字符

          + 是和*類似的元字符,不同的是*匹配重復任意次(可能是0),而+則匹配重復1次或更多次

          \d 單個數字

          \s 匹配任意的空白符,包括空格,制表符(Tab),換行符,中文全角空格等

          ^ 匹配你要用來查找的字符串的開頭,$匹配結尾。和忽略大小寫的選項類似,有些正則表達式處理工具還有一個處理多行的選項。如果選中了這個選項,^$的意義就變成了匹配行的開始處和結束處 這個我也不明白(現在明白了,就是如果要指明匹配整串字符的話就可以使用這兩個來指明。)

          \ 字符轉義

          [] 表示括號內的其中一個或者括號內范圍的其中一個,例如[aeiou],[1-9],[a-z0-9A-Z]

          對于上面的表示實際字符的代碼,都可以加上{數量}來指定匹配指定數量的字符,例如\d{7}, \w{5}表示7個數字,5個字符

          | 兩個正則表達式的或關系,即匹配其中一個就行,從左到右匹配,成功后將不繼續比較,所以長的串應該放于前面

          () 整體,括住一個表達式,然后可以整體操作,例如:(\d{1,3}\.){3}\d{1,3}是一個簡單的IP地址匹配表達式。要理解這個表達式,請按下列順序分析它:\d{1,3}匹配13位的數字,(\d{1,3}\.}{3}匹配三位數字加上一個英文句號(這個整體也就是這個分組)重復3次,最后再加上一個一到三位的數字(\d{1,3})

          # 注釋,在()內有效,若啟用忽略模式里的空白符的選項,則()內每一行#號后的都是注釋

          簡表

          1.常用的元字符

          代碼

          說明

          .

          匹配除換行符以外的任意字符

          \w

          匹配字母或數字或下劃線或漢字

          \s

          匹配任意的空白符

          \d

          匹配數字

          \b

          匹配單詞的開始或結束

          ^

          匹配字符串的開始

          $

          匹配字符串的結束


          2.常用的限定符

          代碼/語法

          說明

          *

          重復零次或更多次

          +

          重復一次或更多次

          ?

          重復零次或一次

          {n}

          重復n

          {n,}

          重復n次或更多次

          {n,m}

          重復nm

          一般情況下,重復限定符會匹配盡量多的字符串,即所謂的貪婪匹配,在重復限定符后加上?號變成懶惰匹配,則匹配盡量少的字符串

          3.常用的反義代碼

          代碼/語法

          說明

          \W

          匹配任意不是字母,數字,下劃線,漢字的字符

          \S

          匹配任意不是空白符的字符

          \D

          匹配任意非數字的字符

          \B

          匹配不是單詞開頭或結束的位置

          [^x]

          匹配除了x以外的任意字符

          [^aeiou]

          匹配除了aeiou這幾個字母以外的任意字符

          比較難的點,詳細說明一下

          后向引用

          使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。

          后向引用用于重復搜索前面某個分組匹配的文本。例如,\1代表分組1匹配的文本。難以理解?請看示例:

          \b(\w+)\b\s+\1\b可以用來匹配重復的單詞,像go go, kitty kitty。首先是一個單詞,也就是單詞開始處和結束處之間的多于一個的字母或數字(\b(\w+)\b),然后是1個或幾個空白符(\s+),最后是前面匹配的那個單詞(\1)

          你也可以自己指定子表達式的組名。要指定一個子表達式的組名,請使用這樣的語法:(?<Word>\w+)(或者把尖括號換成'也行:(?'Word'\w+)),這樣就把\w+的組名指定為Word了。要后向引用這個分組捕獲的內容,你可以使用\k<Word>,所以上一個例子也可以寫成這樣:\b(?<Word>\w+)\b\s+\k<Word>\b

          使用小括號的時候,還有很多特定用途的語法。下面列出了最常用的一些:

          4.分組語法

          捕獲

          (exp)

          匹配exp,并捕獲文本到自動命名的組里

          (?<name>exp)

          匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)

          (?:exp)

          匹配exp,不捕獲匹配的文本,也不給此分組分配組號

          位置指定

          (?=exp)

          匹配exp前面的位置

          (?<=exp)

          匹配exp后面的位置

          (?!exp)

          匹配后面跟的不是exp的位置

          (?<!exp)

          匹配前面不是exp的位置

          注釋

          (?#comment)

          這種類型的組不對正則表達式的處理產生任何影響,用于提供注釋讓人閱讀

          我們已經討論了前兩種語法。第三個(?:exp)不會改變正則表達式的處理方式,只是這樣的組匹配的內容不會像前兩種那樣被捕獲到某個組里面。


          零寬斷言

          接下來的四個用于查找在某些內容(但并不包括這些內容)之前或之后的東西,也就是說它們像\b,^,$那樣用于指定一個位置,這個位置應該滿足一定的條件(斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧:

          (?=exp)也叫零寬度正預測先行斷言,它斷言自身出現的位置的后面能匹配表達式exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會匹配singdanc

          (?<=exp)也叫零寬度正回顧后發斷言,它斷言自身出現的位置的前面能匹配表達式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading

          假如你想要給一個很長的數字中每三位間加一個逗號(當然是從右邊加起了),你可以這樣查找需要在前面和里面添加逗號的部分:((?<=\d)\d{3})*\b,用它對1234567890進行查找時結果是234567890

          下面這個例子同時使用了這兩種斷言:(?<=\s)\d+(?=\s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)


          6.常用的處理選項

          名稱

          說明

          IgnoreCase(忽略大小寫)

          匹配時不區分大小寫。

          Multiline(多行模式)

          更改^$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個字符串的開頭和結尾匹配。

          Singleline(單行模式)

          更改.的含義,使它與每一個字符匹配(包括換行符\n)。

          IgnorePatternWhitespace(忽略空白)

          忽略表達式中的非轉義空白并啟用由#標記的注釋。

          RightToLeft(從右向左查找)

          匹配從右向左而不是從左向右進行。

          ExplicitCapture(顯式捕獲)

          僅捕獲已被顯式命名的組。

          ECMAScript(JavaScript兼容模式)

          使表達式的行為與它在JavaScript里的行為一致。

          7.尚未詳細討論的語法

          \a

          報警字符(打印它的效果是電腦嘀一聲)

          \b

          通常是單詞分界位置,但如果在字符類里使用代表退格

          \t

          制表符,Tab

          \r

          回車

          \v

          豎向制表符

          \f

          換頁符

          \n

          換行符

          \e

          Escape

          \0nn

          ASCII代碼中八進制代碼為nn的字符

          \xnn

          ASCII代碼中十六進制代碼為nn的字符

          \unnnn

          Unicode代碼中十六進制代碼為nnnn的字符

          \cN

          ASCII控制字符。比如\cC代表Ctrl+C

          \A

          字符串開頭(類似^,但不受處理多行選項的影響)

          \Z

          字符串結尾或行尾(不受處理多行選項的影響)

          \z

          字符串結尾(類似$,但不受處理多行選項的影響)

          \G

          當前搜索的開頭

          \p{name}

          Unicode中命名為name的字符類,例如\p{IsGreek}

          (?>exp)

          貪婪子表達式

          (?<x>-<y>exp)

          平衡組

          (?im-nsx:exp)

          在子表達式exp中改變處理選項

          (?im-nsx)

          為表達式后面的部分改變處理選項

          (?(exp)yes|no)

          exp當作零寬正向先行斷言,如果在這個位置能匹配,使用yes作為此組的表達式;否則使用no

          (?(exp)yes)

          同上,只是使用空表達式作為no

          (?(name)yes|no)

          如果命名為name的組捕獲到了內容,使用yes作為表達式;否則使用no

          (?(name)yes)

          同上,只是使用空表達式作為no



          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 康乐县| 奎屯市| 新闻| 辰溪县| 罗山县| 济阳县| 武乡县| 上虞市| 托克逊县| 博客| 临桂县| 阜新| 池州市| 偃师市| 蓝山县| 镇雄县| 乃东县| 华池县| 图木舒克市| 伊金霍洛旗| 韩城市| 来宾市| 长沙县| 九寨沟县| 桃园市| 德钦县| 金乡县| 南康市| 航空| 宝鸡市| 巴林右旗| 呼和浩特市| 库尔勒市| 方城县| 武功县| 万全县| 自治县| 白河县| 吴桥县| 慈溪市| 泸州市|