国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > regex > 正文

正則表達(dá)式教程之元字符的使用詳解

2020-01-20 22:03:07
字體:
供稿:網(wǎng)友

本文實(shí)例講述了正則表達(dá)式教程之元字符的使用。分享給大家供大家參考,具體如下:

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

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

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


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

二、匹配空白字符

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

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

/b 回退(并刪除)一個(gè)字符(Backspace鍵)
/f 換頁符
/n 換行符
/r 回車符
/t 制表符(Tab鍵)
/v 垂直制表符

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

文本:

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

注意:Unix和Linux操作系統(tǒng)中只使用一個(gè)換行符來結(jié)束一個(gè)文本行,換句話說,在Unix或Linux系統(tǒng)中匹配空白行只使用/n/n即可,不需要加上/r。同時(shí)適用于windows和Unix/Linux的正則表達(dá)式應(yīng)該包括一個(gè)可先的/r和一個(gè)必須匹配的/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"));}

運(yùn)行結(jié)果如下:

原內(nèi)容:8 5 4 1 6 3 2 7 97 6 2 9 5 8 3 4 19 3 1 4 2 7 8 5 66 9 3 8 7 5 1 2 45 1 8 3 4 2 6 9 72 4 7 6 1 9 5 3 83 2 6 7 8 4 9 1 54 8 9 5 3 1 7 6 21 7 5 2 9 6 4 8 3 處理后:-----------------------------8 5 4 1 6 3 2 7 97 6 2 9 5 8 3 4 19 3 1 4 2 7 8 5 66 9 3 8 7 5 1 2 45 1 8 3 4 2 6 9 72 4 7 6 1 9 5 3 83 2 6 7 8 4 9 1 54 8 9 5 3 1 7 6 21 7 5 2 9 6 4 8 3

三、匹配特定的字符類別

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

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

/d 任何一個(gè)數(shù)字,等價(jià)于[0-9]或[0123456789]
/D 任何一個(gè)非數(shù)字,等價(jià)于[^0-9]或[^0123456789]

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

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

/w 任何一個(gè)字母(不區(qū)分大小寫)、數(shù)字、下劃線,等價(jià)于[0-9a-zA-Z_]
/W 任何一個(gè)非字母數(shù)字和下劃線,等價(jià)于[^0-9a-zA-Z_]

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

/s 任何一下空白字符,等價(jià)于[/f/n/r/t/v]
/S 任何一下空白字符,等價(jià)于[^/f/n/r/t/v]

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

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

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

四、使用POSIX字符類

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

[:alnum:] 任何一個(gè)字母或數(shù)字,等價(jià)于[a-zA-Z0-9]
[:alpha:] 任何一個(gè)字母,等價(jià)于[a-zA-Z]
[:blank:] 空格或制表符,等價(jià)于[/t]
[:cntrl:] ASCII控制字符(ASCII 0到31,再加上ASCII 127)
[:digit:] 任何一個(gè)數(shù)字,等價(jià)于[0-9]
[:graph:] 任何一個(gè)可打印字符,但不包括空格
[:lower:] 任何一個(gè)小寫字母,等價(jià)于[a-z]
[:print:] 任何一個(gè)可打印字符
[:punct:] 既不屬于[:alnum:]和[:cntrl:]的任何一個(gè)字符
[:space:] 任何一個(gè)空白字符,包括空格,等價(jià)于[^/f/n/r/t/v]
[:upper:] 任何一個(gè)大寫字母,等價(jià)于[A-Z]
[:xdigit:] 任何一個(gè)十六進(jìn)制數(shù)字,等價(jià)于[a-fA-F0-9]

POSIX字符和之前見過的元字符不太一樣,我們來看一個(gè)前面利用正則表達(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字符必須括在[:和:]之間,外層[和]字符用來定義一個(gè)集合,內(nèi)層的[和]字符是POSIX字符類本身的組成部分。

在java中的POSIX字符表示有所不同,不是包括在[:和:]之間,而是以/p開頭,包括在{和}之間,且大小寫有區(qū)別,同時(shí)增加了/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)點(diǎn)符號:!"#$%&'()*+,-./:;<=>?@[/]^_`{|}~
/p{Space} 空白字符:[ /t/n/x0B/f/r]
/p{Upper} 大寫字母字符:[A-Z]
/p{XDigit} 十六進(jìn)制數(shù)字:[0-9a-fA-F]

PS:這里再為大家提供2款非常方便的正則表達(dá)式工具供大家參考使用:

JavaScript正則表達(dá)式在線測試工具:
http://tools.VeVB.COm/regex/javascript

正則表達(dá)式在線生成工具:
http://tools.VeVB.COm/regex/create_reg

希望本文所述對大家正則表達(dá)式學(xué)習(xí)有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 扶余县| 教育| 普格县| 垫江县| 永定县| 永平县| 鄂托克旗| 正阳县| 辽源市| 珲春市| 大安市| 济源市| 资源县| 集安市| 德清县| 庄河市| 苍南县| 老河口市| 玛多县| 香河县| 玛沁县| 衡山县| 竹山县| 鄂托克旗| 无极县| 彰化县| 揭东县| 滨海县| 出国| 绥化市| 阿荣旗| 广南县| 嫩江县| 双桥区| 大安市| 乌海市| 化德县| 金塔县| 清原| 西畴县| 卢湾区|