一、使用轉義
在接觸元字符之前,理解好正則表達式中的轉義是非常重要的。在前面的幾章中,我們或多或少接觸了一些關于轉義的內容,在這里,我們再詳細地研究一下正則表達式中的轉義。
正則表達式中的元字符是具有特定含義的字符。例如“.”,它能夠與除了換行符之外的任意字符相匹配;與之類似的還有“?”,表示參與匹配的樣式重復零次或一次。既然它們都被賦予了特殊的含義,那么它們就不能再用來與自身相同的普通字符進行匹配了,例如“.”、“)”和“[”就不能直接作為匹配字符而直接使用。
var myArray = new Array(); ... if (myArray[0] == 0) { ... }
對于上面的JavaScript代碼,我們用正則表達式 myArray[0] 來匹配數組元素myArray[0],但是結果并不像我們預想的那樣,這是因為 [0] 在正則表達式中是作為字符集合的含義出現,匹配的內容是“0”,而不是“[0]”。所以,正則表達式 myArray[0] 真正匹配的內容是“myArray0”,而不是我們想要的“myArray[0]”。
既然這樣,我們換一個含有轉義功能的正則表達式 myArray/[0/] 再來做一次試驗,這次成功匹配了。

“/”是具有轉義作用的元字符,既然是元字符,就不能跟字符“/”相匹配了,但“/”的功能不光是對其他元字符進行轉移,就連它自身也可以進行轉移,所以, // 就能和字符“/”相匹配。字符串“C:/WINDOWS”對應的正則表達式就應該是 C://WINDOWS 。
二、元字符
正則表達式中的原字符分為兩大類,一種是參與文本匹配的,比如“.”,另外一種是作為正則表達式語法的一部分而存在,如“?”,“[”和“]”。在實際的應用中,我們將發現有很多這樣的原字符,它們是以“空白”元字符開頭的。在這里,我們簡紹幾個常用的正則表達式元字符。
-
/w
“/w”只能匹配英文字母、數字和下劃線。因此,它與元字符“.”并不相同,因為“/w”不能夠與符號、標點相匹配。在有些非英語的語言中,“/w”的解釋有所不同,它可以與被設置的語言的文字或字母相匹配。如果“/w”的關聯文是 Unicode 而非 ASCII,那么它能夠匹配到的范圍就更為廣泛了。
現在讓我們看看“/w”的功能,首先構造正則表達式 /w+ ,然后把字符串“Hello World! 世界你好!”作為測試對象,匹配的結果就是“ Hello World ! 世界你好 !”
-
/W
“/W”與“/w”匹配的內容相反,只要是/w無法匹配的內容,它都能夠進行匹配。也就是說,/W能夠匹配那些非字母、數字和下劃線的內容。但匹配內容也不是絕對的,還要根據所使用的具體正則引擎而定。
我們同樣以“Hello World! 世界你好!”為例,利用正則表達式 /W+ 匹配的結果就是“Hello World ! 世界你好 ! ”。
-
/d
“/d”能夠與數字相匹配,相當于[0-9]的縮寫。
再回顧一下前章電話號碼校驗的例子,要匹配的字符串為“+086-800-800-8888”,之前構造出來的正則表達式是 /+?[0123456789]{2,3}-[0123456789]{3}-[0123456789]{3}-[0123456789]{4} ,而有了/d,我們就可以把它簡化為/+?/d{2,3}-/d{3}-/d{3}-/d{4}。
-
/D
與“/W”類似,“/d”也有個與之對應的“/D”,它能與數字之外的任意字符相匹配。
三、空白與非空白元字符
-
/s
我們在進行正則表達式搜索的時候,常常會碰到嵌套在文本里的非打印字符。這些字符有時會極大地干擾我們的查找工作,所以最好是先將它們清除掉。元字符“/s”代表了多種非打印字符。
符號 含義[/b] 退格(Backspace) /f 換頁符 /n 換行符 /r 回車符 /t 水平制表符 /v 垂直制表符 -
/S
與“/d”、“/w”類似,也有一個與“/s”對應的“/S”,它所匹配的內容是非空白字符。
四、使用POSIX字符類
在有些正則表達式引擎中,實現了一種叫做 POSIX 字符類的特殊功能,POSIX 可以簡單的看作是常用的字符集合。比如我們常常用 /d 表示 0 至 9 之間的數字, /s 表示空白字符;而用 POSIX 中的[:alnum:],就能代表正則表達式[A-Za-z0-9],其中的 alnum 是 alphanumeric 的縮寫。由此可見,POSIX 是采用了命名的方式來代替使用多個字符集,這樣不光能為我們構造正則表達式節省了時間,而且提供了很大方便。因正則表達式引擎的不同,所使用的命名方式也有可能不同,這就要求我們在利用 POSIX 方法構造正則表達式之前先了解所使用的引擎支持的正確的 POSIX 格式。
下面我們在 EmEditor 中用 POSIX 做個小實驗。首先查看幫助,看看在 EmEditor 可以使用什么樣的 POSIX 語法,下表中列出了所有可用的 POSIX 語法。
Character Classes
The following character classes are used within a character set such as "[:classname:]". For instance, "[[:space:]]" is the set of all whitespace characters.
alnum | Any alphanumeric character. |
alpha | Any alphabetical character a-z, A-Z, and other character. |
blank | Any blank character, either a space or a tab. |
cntrl | Any control character. |
digit | Any digit 0-9. |
graph | Any graphical character. |
lower | Any lowercase character a-z, and other lowercase character. |
Any printable character. | |
punct | Any punctuation character. |
space | Any whitespace character. |
upper | Any uppercase character A-Z, and other uppercase character. |
xdigit | Any hexadecimal digit character, 0-9, a-f and A-F. |
word | Any word character - all alphanumeric characters plus the underscore. |
unicode | Any character whose code is greater than 255. |
從表格中可以看出 [:digit:] 的作用與 [0-9] 完全一樣,所以,當從例子的 SQL 語句中查找匹配內容時,16 和 24 被成功的匹配。
五、修飾符
在使用正則表達式時,有時候我們需要使用一些選項來控制匹配的模式。比如我們的表達式是否需要嚴格地按照字母大小寫來進行匹配;表達式是否可以按行為單位來進行工作。 大多數支持正則表達式的編輯器都會提供一個“是否區分大小寫”的選項;而在編程語言中,使用正則表達式功能時如果沒有特別指定操作選項,結果都是按行為單位返回的。對于修飾符的詳細使用我們會在后面的應用章節詳細敘述。
<!-- InstanceEndEditable -->
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
