注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

chunwaihome 的博客

 
 
 

日志

 
 

Regular Expression  

2009-09-15 14:19:50|  分类: Regular Expressi |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Regular Expression 是一種字串表達的方式, 使用者可使用一個簡短的Regular Expression 來表示 〝具有某特徵〞 或者 〝複雜難以描述〞的所有字串.,而日常資料處理中, 最常進行的工作是『從檔案中找出具有某特徵的字串, 再加以處理(列印,置換, 計算...)』。此時, Regular Expression 便可派上用場了,使用一個簡短的 Regular Expression 便可完全指定需要加以處理的資料 ,避免反覆判斷找尋的困擾. 譬如 :

若使用 MS-DOS 中文字編輯器edit 的找尋功能, 可來找出檔案中所有的 ``prg1.c''; 但 edit 卻無法一次同時找尋字串``prg1.c''、``prg2.c'' ... 或 ``prg8.c''; 必需 反覆執行八次找尋的動作。

可是在 UNIX 中的 vi , 使用一個 Regular Expression `` prg[0-8]\.c'' 便可同時表示上述八個字串, 如此一次就可找出指定的所有字串.

可見 Regular Expression 確實十分便利。然而, MS-DOS 下許多工具的設計並不支援解讀 Regular Expression.,但UNIX 環境下除了 vi 外, 還有許多工具都接受Regular Expression, 如 : grep、sed、awk、csplit... . 使用這些工具時, 便可應用 Regular Expression 來指定欲找尋的字串;  並可配合這些工具的其它功能將找尋到的資料進一步地加以處理.下面列出一些reg的應用方法

 \
  •    使用  Regular Expression 來表示字串``a.out''時,不可寫成
        Regexp  ``a.out'',因為``.''在 Regular Expression 中"."是特殊
        字元,表示任一字元;同時,可合乎Regexp  ``a.out''
        的字串將不只 ``a.out'' 一個;其他如字串``a2out'',``a3out''
        ,``aaout''...等都合於 Regexp `` a.out''。因此,其正確的表
        示法應為: Regexp `` a\.out''
  •     ``\''  在 Regular Expression 中的另一個意義是當成Escape
        character。例如:

      ``\t'' 用以表示 tab。 ``\n'' 表示換行符號。

字符转义如果你想查找元字符本身的話,比如你查找.,或者*,就出現了問題:你辦法指定它們,因為它們會被解釋成別的意思。這時你就得使用\來取消這些字符的特殊意義。因此,你應該使用\.和\*。當然,要查找\本身,你也得用\\.

例如:deerchao\.net匹配deerchao.net,C:\\Windows匹配C:\Windows。

^ (begining of line) 代表句子的最前面
 $(endof line) 代表句子的結束位置
 *(ZERO OR MORE)
  • Regexp ``ab*'' 中,``*'' 形容它前方的字元 ``b'' 可出
        現  1  次或多次, 或不出現。所以,Regexp ``ab*'' 可表示字串
        ``a''、``ab''、``abb''、 ``abbb''、...。
  •    Regexp `` T[0-9]*\.c'' 中,使用 ``*'' 形容其前的字元
        集合 `` [0-9]''(一個阿拉伯數字)出現的次數:可為 0 次或多次
        。故  Regexp `` T[0-9]*\.c''可用以表示 ``T.c''、``T0.c''、
        ``T1.c''、``T2.c''、...、``T9.c''、``T00.c''、``T01.c''、
        ``T02.c''、...、      ``T09.c''、``T10.c''、...``T99.c''、
        ``T000.c''、...。
 +(one or more)  形容它前的字元1或者無限次
 ?(zero or one)  形容它前的字元零或者1次
 {n}

 n is a nonnegative integer. Matches exactly n times.

For example, 'o{2}' does not match the "o" in "Bob" but matches the two o's in "food".

 {n,}

 n is a nonnegative integer. Matches at least n times.

For example, 'o{2,}' does not match "o" in "Bob" and matches all the o's in "foooood". "o{1,}" is equivalent to 'o+'. 'o{0,}' is equivalent to 'o*'.

 {n,m}

 m and n are nonnegative integers, where n <= m. Matches at least n and at most m times.

For example, "o{1,3}" matches the first three o's in "fooooood". 'o{0,1}' is equivalent to 'o?'. Note that you cannot put a space between the comma and the numbers.

 (pattern)

它有兩種使用的目的

1)相等於\(\)需配合下面的\1-\9使用

 用以括住一群字元,且將之視成一個group例如

2)Regexp `` 12+'' 表示字串 "12","122","1222","12222",...
Regexp `` (12)+'' 表示字串 "12","1212","1212","1212"....

 \1 - \9

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

\b(\w+)\b\s+\1\b可以用來匹配重複的單詞,像go go, 或者kitty kitty。這個表達式首先是一個單詞,也就是單詞開始處和結束處之間的多於一個的字母或數字(\b(\w+)\b),這個單詞會被捕獲到編號為1的分組中,然後是1個或幾個空白符(\s+),最後是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\1)。

 x|y

 Matches either x or y.

 For example, 'z|food' matches "z" or "food". '(z|f)ood' matches "zood" or "food". 

 

 [xyz]

A character set. Matches any one of the enclosed characters.

For example, '[abc]' matches the 'a' in "plain". 

像[aeiou]就匹配任何一個英文元音字母,[.?!]匹配標點符號(.或?或!)。

 [^xyz]

A negative character set. Matches any character not enclosed.

 For example, '[^abc]' matches the 'p' in "plain". 

[0-9^]'' 表示一個阿拉伯數字或字元 `` ^'', 並非代表阿伯數字外的任意字元.

 [a-z]

A range of characters. Matches any character in the specified range. For example, '[a-z]' matches any lowercase alphabetic character in the range 'a' through 'z'.

註:

[0-9]代表的含意与\d就是完全一致的

[a-z0-9A-Z_]也完全等同于\w

 [^a-z]

A negative range characters. Matches any character not in the specified range.

 For example, '[^a-z]' matches any character not in the range 'a' through 'z'.

 .

 Matches any single character.

 For example, ".e" will match text where any character precedes an "e", like "he", "we", or "me". 代表任何一個普通字元,而普通字元包括所有字元除了以下的``.''、``[''、``]''、``*''、``+''、``?''、 ``|''、``^''、``$''、``{''、``}''、``\''、 ``<''、``>''、``(''、``)''

假如你要找的是hi後面不遠處跟著一個Lucy,你應該用\bhi\b.*\bLucy\b。

這裡,.是另一個元字符(metacharacter),匹配除了換行符以外的任意字符。因此,.*連在一起就意味著任意數量的不包含換行的字符。現在\bhi\b.*\bLucy\b的意思就很明顯了:先是一個單詞hi,然後是任意個任意字符(但不能是換行),最後是Lucy這個單詞。

\d

表示任何一個數字,意同 [0-9]

 \D 表示任何一個非數字,意同 [^0-9] 。

 0x07  \a  Bell characer.
 0x0C  \f  Form feed
 0X0A  \n  Newline character
 0XOD  \r  carriage return
 0X09  \t  Tab character
 0X0B  \v  vertical tab
     
     
     
     

 

\w 

 Any word character - all alphanumeric characters plus the underscore.(匹配字母或數字或下劃線或漢字)

[a-z0-9A-Z_]等同于\w

 \s  Any whitespace character.
 \b  Matches a word boundary (the start or end of a word).
 \B  Matches only when not at a word boundary.
   
   
   
   
   
   

  评论这张
 
阅读(532)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017