首頁  >  文章  >  web前端  >  正規的元字元使用詳解

正規的元字元使用詳解

php中世界最好的语言
php中世界最好的语言原創
2018-03-30 09:49:431733瀏覽

這次帶給大家正規的元字元使用詳解,正規元字元使用的注意事項有哪些,下面就是實戰案例,一起來看一下。

註:在所有例子中正規表示式匹配結果包含在原始文字中的之間,有的例子會使用Java來實現,如果是java本身正規表示式的用法,就會在對應的地方說明。所有java例子都在JDK1.6.0_13下測試通過。

一、對特殊字元進行轉義

#元字元是一些在正規表示式裡有著特殊意義的字元。因為元字元在正規表示式裡有著特殊的意義,所以這些字元就無法用來代表它們本身。在元字元前面加上一個反斜線就可以對它進行轉義,這樣得到的轉義序列將會匹配那個字元本身而不是它特殊的元字元意義。如,如果想要匹配[和],就必須對它進行轉義:


對元字符轉義需要用到斜杠\字符,這意味著\字符本向也是一個元字符,要匹配\字符本身,必須轉義成\\。如匹配windows檔案路徑。

二、匹配空白字元

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

在進行正規表示式搜尋的時候,我們經常會遇到需要對原始文字中裡的非列印空白字元進行比對的情況。比方說,我們可能需要把所有的製表符找出來,或者我們需要把換行符找出來,這類字元很難被直接輸入到一個正規表示式裡,這時我們可以使用如下列出的特殊元字元來輸入它們:

\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 45 1 8 3 4 2  6 9 7
2 4 7 6 1 9  5 3 8

3 26  7 8 4 9 1 54 8 9 5 3 1  7 6 2
1 7 5 2 9 6  4 8 3

正規表示式:

\r\n\r\n

分析:\r\n符合一個回車+換行組合,windows作業系統中把它當作文字行的結束標籤。使用正規表示式\r\n\r\n進行的搜尋將符合兩個連續的行尾標籤,而這正好是空白行。

注意:Unix和Linux作業系統中只使用一個換行符來結束一個文字行,換句話說,在Unix或Linux系統中匹配空白行只使用\n\n即可,不需要加上\r。同時適用於windows和Unix/Linux的正規表示式應該包括一個可先的\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" + sb.toString());
  System.out.println("处理后:-----------------------------");
  System.out.println(sb.toString().replaceAll(reg, "\r\n"));
}
執行結果如下:

原内容:
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

三、符合特定的字元類別

字元集合(符合多個字元中的某一個)是最常見的匹配形式,而一些常用的字元集合可以用特殊元字元來取代。這些元字符匹配的是某一類別的字符(類元字符),類元字符並不是必不可少的,因為可以通過逐一列舉有關字符或通過定義一個字符區間來匹配某一類字符,但是使用它們構造出來的正規表示式簡明易懂,在實際應用上很常用。

1、符合數字與非數字

\d 任何一個數字,等價於[0-9]或[0123456789]

\D 任何一個非數字,等價於[^0-9]或[^0123456789]

2、匹配字母和數字與非字母和數字

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

\w 任何一個字母(不區分大小寫)、數字、底線,等價於[0- 9a-zA-Z_]

\W 任何一個非字母數字和底線,等價於[^0-9a-zA-Z_]

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

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

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

注意:退格元字元\b沒有不在\s的範圍之內。

4、匹配十六進位或八進位數值

十六進位:用前綴\x來給出,如:\x0A對應於ASCII字元10 (換行符),其效果等價於\n。

八進位:用前綴\0來給出,數值本身可以是兩位或三位數字,如:\011對應於ASCII字元9(製表符),其效果等價於\t。

四、使用POSIX字元類別

POSIX字元類別是許多正規表示式實作都支援的一種簡寫形式。 Java也支援它,但JavaScript不支援。 POSIX字元如下圖所示:

[:alnum:]任何一個字母或數字,等價於[a-zA-Z0-9] [:alpha:]任何一個字母,等價於[a-zA-Z][ :blank:]空格或製表符,等價於[\t]#[:cntrl:]ASCII控製字元( ASCII 0到31,再加上ASCII 127)[:digit:]任何一個數字,等價於[0-9][:graph:]任何一個可列印字符,但不包括空格[:lower:]任何一個小寫字母,等價於[a-z][:print:]任何一個可列印字元[:punct:]#既不屬於[:alnum:]和[:cntrl:]的任何一個字元[:space:]任何一個空白字符,包括空格,等價於[^\f\n\r\t\v][:upper:]任何一個大寫字母,等價於[A-Z][:xdigit:]#任何十六進位數字,等價於[a- fA-F0-9]

POSIX字元和之前見過的元字元不太一樣,我們來看一個前面利用正規表示式來匹配網頁中的顏色的例子:

文字:background-color:#3636FF;height:30px;width:60px;">測試

#正則表達式:#[[ :xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]]

#結果:【#3636FF】;height:30px;width:60px;">測試

註:這裡使用的模式以[[開頭、以]]結束,這是使用POSIX字元類別所必須的,POSIX字元必須括在[:和:]之間,外層[和]字元用來定義一個集合,內層的[和]字元是POSIX字元類別本身的組成部分。

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

\p{Alnum} 字母數字字元:[\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} 十進位數字:[0-9]
#\p{Graph} 可見字元: [\p{Alnum}\p{Punct}]
\p{Lower} 小寫字母字元:[a-z]
\p{Print} 可列印字元:[\p{Graph}\x20]
\p{Punct} 標點符號:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Space} 空白字元:[ \t\n\x0B\f\r]
#\p{Upper} 大寫字母字元:[A-Z]
\p{XDigit} #十六進位數字:[0-9a-fA-F]

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!推薦閱讀:

正規表示式教學的位置比對教學(附程式碼)


#JS的密碼強度校驗正規表示式(附程式碼)

以上是正規的元字元使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn