<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-31  評論-14  文章-0  trackbacks-0

    PS:在所有例子中正則表達(dá)式匹配結(jié)果包含在源文本中的【和】之間,有的例子會使用java來實現(xiàn),如果是java本身正則表達(dá)式的用法,會在相應(yīng)的地方說明。所有java例子都在JDK1.6.0_13下測試通過。

     

    一、對特殊字符進(jìn)行轉(zhuǎn)義

             元字符是一些在正則表達(dá)式里有著特殊含義的字符。因為元字符在正則表達(dá)式里有著特殊的含義,所以這些字符就無法用來代表它們本身。在元字符前面加上一個反斜杠就可以對它進(jìn)行轉(zhuǎn)義,這樣得到的轉(zhuǎn)義序列將匹配那個字符本身而不是它特殊的元字符含義。如,如果想要匹配[和],就必須對它進(jìn)行轉(zhuǎn)義:\[和\]。

             對元字符轉(zhuǎn)義需要用到斜杠\字符,這就意味著\字符本向也是一個元字符,要匹配\字符本身,必須轉(zhuǎn)義成\\。如匹配windows文件路徑。

     

    二、匹配空白字符

             元字符大致可以分為兩種:一種是用來匹配文本的(如.),另一種是正則表達(dá)式的語法所要求的(如[和])。

             在進(jìn)行正則表達(dá)式搜索的時候,我們經(jīng)常會遇到需要對原始文本中里的非打印空白字符進(jìn)行匹配的情況。比如說,我們可能需要把所有的制表符找出來,或者我們需要把換行符找出來,這類字符很難被直接輸入到一個正則表達(dá)式里,這時我們可以使用如下列出的特殊元字符來輸入它們:

             \b     回退(并刪除)一個字符(Backspace鍵)

             \f      換頁符

             \n     換行符

             \r      回車符

             \t      制表符(Tab鍵)

             \v      垂直制表符

     

             來看一個例子,把文件中的空白行去掉:

    文本:

    8 5 4 1 6 3  2 7 9

    7 6 2 9 5 8  3 4 1

    9 3 1 4 2 7  8 5 6

     

    6 9 3 8 7 5  1 2 4

    5 1 8 3 4 2  6 9 7

    2 4 7 6 1 9  5 3 8

     

    3 26  7 8 4 9 1 5                                                       

    4 8 9 5 3 1  7 6 2

    1 7 5 2 9 6  4 8 3

    正則表達(dá)式:\r\n\r\n

    分析:\r\n匹配一個回車+換行組合,windows操作系統(tǒng)中把它作為文本行的結(jié)束標(biāo)簽。使用正則表達(dá)式\r\n\r\n進(jìn)行的搜索將匹配兩個連續(xù)的行尾標(biāo)簽,而這正好是空白行。

             注意:Unix和Linux操作系統(tǒng)中只使用一個換行符來結(jié)束一個文本行,換句話說,在Unix或Linux系統(tǒng)中匹配空白行只使用\n\n即可,不需要加上\r。同時適用于windows和Unix/Linux的正則表達(dá)式應(yīng)該包括一個可先的\r和一個必須匹配的\n,即\r?\n\r?\n,這將會在后面的文章中講到。

             Java代碼如下:

        public static void matchBlankLine() throws Exception{
            BufferedReader br 
    = new BufferedReader(new FileReader(new File("E:/九宮格.txt")));
            StringBuilder sb 
    = new StringBuilder();
            
    char[] cbuf = new char[1024];
            
    int len = 0;
            
    while(br.ready() && (len = br.read(cbuf)) > 0){
                br.read(cbuf);
                sb.append(cbuf, 
    0, len);
            }
            String reg 
    = "\r\n\r\n";
            System.out.println(
    "原內(nèi)容:\n" + sb.toString());
            System.out.println(
    "處理后:-----------------------------");
            System.out.println(sb.toString().replaceAll(reg, 
    "\r\n"));
        }

    運行結(jié)果如下:

    原內(nèi)容:

    8 5 4  1 6 3 2 7 9

    7 6 2  9 5 8 3 4 1

    9 3 1  4 2 7 8 5 6

     

    6 9 3  8 7 5 1 2 4

    5 1 8  3 4 2 6 9 7

    2 4 7  6 1 9 5 3 8

     

    3 2 6  7 8 4 9 1 5

    4 8 9  5 3 1 7 6 2

    1 7 5  2 9 6 4 8 3

    處理后:-----------------------------

    8 5 4  1 6 3 2 7 9

    7 6 2  9 5 8 3 4 1

    9 3 1  4 2 7 8 5 6

    6 9 3  8 7 5 1 2 4

    5 1 8  3 4 2 6 9 7

    2 4 7  6 1 9 5 3 8

    3 2 6  7 8 4 9 1 5

    4 8 9  5 3 1 7 6 2

    1 7 5  2 9 6 4 8 3


    三、匹配特定的字符類別

             字符集合(匹配多個字符中的某一個)是最常見的匹配形式,而一些常用的字符集合可以用特殊元字符來代替。這些元字符匹配的是某一類別的字符(類元字符),類元字符并不是必不可少的,因為可以通過逐一列舉有關(guān)字符或通過定義一個字符區(qū)間來匹配某一類字符,但是使用它們構(gòu)造出來的正則表達(dá)式簡明易懂,在實際應(yīng)用中很常用。

     

             1、匹配數(shù)字與非數(shù)字

             \d     任何一個數(shù)字,等價于[0-9]或[0123456789]

             \D     任何一個非數(shù)字,等價于[^0-9]或[^0123456789]

     

             2、匹配字母和數(shù)字與非字母和數(shù)字

             字母(A-Z不區(qū)分大小寫)、數(shù)字、下劃線是一種常用的字符集合,可用如下類元字符:

             \w    任何一個字母(不區(qū)分大小寫)、數(shù)字、下劃線,等價于[0-9a-zA-Z_]

             \W    任何一個非字母數(shù)字和下劃線,等價于[^0-9a-zA-Z_]

     

             3、匹配空白字符與非空白字符

             \s      任何一下空白字符,等價于[\f\n\r\t\v]

             \S      任何一下空白字符,等價于[^\f\n\r\t\v]

             注意:退格元字符\b沒有不在\s的范圍之內(nèi)。

     

             4、匹配十六進(jìn)制或八進(jìn)制數(shù)值

             十六進(jìn)制:用前綴\x來給出,如:\x0A對應(yīng)于ASCII字符10(換行符),其效果等價于\n。

             八進(jìn)制:用前綴\0來給出,數(shù)值本身可以是兩位或三位數(shù)字,如:\011對應(yīng)于ASCII字符9(制表符),其效果等價于\t。

            

    四、使用POSIX字符類

             POSIX字符類是很多正則表達(dá)式實現(xiàn)都支持的一種簡寫形式。Java也支持它,但JavaScript不支持。POSIX字符如下所示:

    [:alnum:]  任何一個字母或數(shù)字,等價于[a-zA-Z0-9]

    [:alpha:]   任何一個字母,等價于[a-zA-Z]

    [:blank:]   空格或制表符,等價于[\t]

    [:cntrl:]     ASCII控制字符(ASCII 0到31,再加上ASCII 127)

    [:digit:]     任何一個數(shù)字,等價于[0-9]

    [:graph:]  任何一個可打印字符,但不包括空格

    [:lower:]   任何一個小寫字母,等價于[a-z]

    [:print:]    任何一個可打印字符

    [:punct:]   既不屬于[:alnum:]和[:cntrl:]的任何一個字符

    [:space:]  任何一個空白字符,包括空格,等價于[^\f\n\r\t\v]

    [:upper:]  任何一個大寫字母,等價于[A-Z]

    [:xdigit:]   任何一個十六進(jìn)制數(shù)字,等價于[a-fA-F0-9]

     

             POSIX字符和之前見過的元字符不太一樣,我們來看一個前面利用正則表達(dá)式來匹配網(wǎng)頁中的顏色的例子:

    文本:<span style="background-color:#3636FF;height:30px;width:60px;">測試</span>

    正則表達(dá)式:#[[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]]

    結(jié)果:<span style="background-color:【#3636FF】;height:30px;width:60px;">測試</span>

    注意:這里使用的模式以[[開頭、以]]結(jié)束,這是使用POSIX字符類所必須的,POSIX字符必須括在[:和:]之間,外層[和]字符用來定義一個集合,內(nèi)層的[和]字符是POSIX字符類本身的組成部分。

    在java中的POSIX字符表示有所不同,不是包括在[:和:]之間,而是以\p開頭,包括在{和}之間,且大小寫有區(qū)別,同時增加了\p{ASCII},如下所示:

    \p{Alnum}         字母數(shù)字字符:[\p{Alpha}\p{Digit}]

    \p{Alpha}          字母字符:[\p{Lower}\p{Upper}]

    \p{ASCII}           所有 ASCII:[\x00-\x7F]

    \p{Blank}           空格或制表符:[ \t]

    \p{Cntrl}            控制字符:[\x00-\x1F\x7F]

    \p{Digit}            十進(jìn)制數(shù)字:[0-9]

    \p{Graph}          可見字符:[\p{Alnum}\p{Punct}]

    \p{Lower}          小寫字母字符:[a-z]

    \p{Print}            可打印字符:[\p{Graph}\x20]

    \p{Punct}          標(biāo)點符號:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

    \p{Space}          空白字符:[ \t\n\x0B\f\r]

    \p{Upper}          大寫字母字符:[A-Z]

    \p{XDigit}          十六進(jìn)制數(shù)字:[0-9a-fA-F]

    posted on 2012-08-12 23:00 zhanghu198901 閱讀(2096) 評論(2)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲黄网在线观看| 国产精品自拍亚洲| 小小影视日本动漫观看免费| 美女裸体无遮挡免费视频网站| 亚洲色大成网站www永久一区| 日日麻批免费40分钟日本的| 美国毛片亚洲社区在线观看| 亚洲高清国产AV拍精品青青草原| 青青草a免费线观a| 一级毛片在播放免费| 亚洲精品中文字幕无码AV| 国产福利免费在线观看| 无码av免费网站| 黄页网址大全免费观看12网站| 亚洲AV无码不卡无码| 暖暖免费高清日本中文| 久草福利资源网站免费| 久久综合亚洲色hezyo| 精品亚洲成a人片在线观看| 免费v片视频在线观看视频| 亚洲视频免费在线播放| 一级毛片试看60分钟免费播放| 亚洲一级高清在线中文字幕| 在线精品亚洲一区二区小说| 成人五级毛片免费播放| 成人性生交大片免费看好| 久久亚洲AV成人无码国产电影 | 亚洲AV成人无码久久WWW| 亚洲av永久无码精品秋霞电影影院 | 国内精品久久久久影院免费 | 亚洲成a∧人片在线观看无码| 久久精品国产96精品亚洲 | 亚洲伊人久久大香线蕉AV| 亚洲成人午夜在线| 亚洲高清无码专区视频| 午夜电影免费观看| 免费看h片的网站| 久久精品免费观看国产| 国产精品免费久久久久电影网| 国产精品亚洲综合| 亚洲中文字幕无码亚洲成A人片|