正規表示式 – Characters

好吧!還是要從基礎的地方開始講起,正規表示式這種東西,可以寫得很簡單,也可以寫到很嚇人,以在下的水準來看,大概死也嚇不了人(笑),不過因為很常用又很難搞懂,所以覺得還是好好的寫篇文章放在部落格,其實,想要使用正規表示式也沒有想像中那麼恐怖啦!

正規表示式裡面,最基礎的當然就是文字的比對,在正規表示式當中,如果你的pattern(就是正規表示式的比對內容)只有一個英文字母,例如”a”,那在比對時,就會比對出所有含有”a”的字,包括cat、access、special、killer@yahoo.com.tw…等等;不管你的 a 有幾個,不管你的 a 是躲在最後面還是放在一開頭,總之,凡是字串中含有 a 的,就會不分青紅皂白的給揪出來。

很好,真是簡單明瞭,但是,如果你要比對一些特殊符號時,可就要小心了!怎麼說呢?

在之前的文章當中,有列舉出許多正規表示式的標記法,你可以看到,當你在正規表示式當中使用”+”號的時候,代表的意思要比對前面那個字元一次以上,不過萬一我們要比對含有”a+b”的字串時,我們就不能傻傻的直接打”a+b”,而必須要在”+”號前面加上脫逸符號”\”,變成”a\+b”,這樣正規表示式在判讀的時候才會把”+”當成正確的字串來解讀,而不是把它當成特殊的比對命令。

那麼,還有哪些符號是必須要被脫逸掉的特殊符號呢?

\   +   [   ]   .   ^   $   *   ?   (   )   |

這些都是正規表示式當中的特殊字元,若是要把它當成文字來比對,就必須要注意使用”\”符號把它脫逸掉;但是,有兩個符號要稍微注意一下,那就是大括弧”{“、”}”,大多數的程式會把大括弧當成單純的字元來處理,除非你是把它用在{1,3}這種標記上面,所以,就算不脫逸也可以正確使用,當然如果你喜歡加”\”把它脫逸掉也是可以的啦!不過 java.util.regex package 卻是不接受這種通融的作法,堅持如果你要把”{}”當成字元來使用,還是得乖乖的使用”\”符號。

除了上面所提到的這些特殊字元外,其他的字母,可千萬別自作聰明的加上”\”喔!因為”\”是個神祕的字元,加在某些字母前面,可是會產生意想不到的比對效果哩!比如說”\d”代表的是比對 0~9 的數字,等於是 “[0-9]” 的簡寫版;而 “\D” 則是代表比對所有非數字的內容,也就是 “[^0-9]” 的簡寫版,其他當然還有更多的特殊表示法,而這些在前一篇文章也都已經有說明列舉,在此就先不囉唆了!

還有啊~如果你自己寫過程式,可能會很習慣把單引號(‘)和雙引號(“)也順手脫逸掉,不過這在正規表示式裡面是不需要的唷!另外一個你必須要注意的是,有的程式,例如C++,它需要透過compiler才能夠執行,在正規表示式被電腦正確解讀以前,你得先過compiler這一關,所以假設你今天想要比對 “1+1=2” 這個字串,雖然在正規表示式當中你要寫成 “1\+1=2” ,但是在C++當中你得寫成 “1\\+1=2″,也就是說,”\” 這個符號你必須把它脫逸掉才能正確的編譯出來喔!

還有一些奇怪的字元,通常都是那種不會被輸出的字元,在正規表示式當中當然也都可以正確的去比對,例如:”\t” 代表 tab 字元(ASCII 0x09)、”\r”代表的則是打字機時代的return(0x0D)、”\n”則是喚行(0x0A)。當然還有更多: \a (bell, 0x07),\e (escape, 0x1B), \f (form feed, 0x0C) ,以及 \v (vertical tab, 0x0B),順便一提的是,在Windows系統當中,文字檔通常是使用”\r\n”作為每一行的結尾,而在Unix系統當中則是使用”\n”。

如果你知道字母的十六進位編碼ASCII或ANSI的話,你也可以隨自己高興的把這些特殊編碼給應用在正規表示式當中,比如說在Latin-1當中的著作權小C符號的十六進位編碼是0xA9,因此你可以使用”\xA9″來搜尋字串當中是否帶有小C符號,同理可證,先前有提到的tab符號,當然就可以寫成”\x09″啦!請記住,那個前面的0,記得用”\”代換掉喔!

如果你的正規表示式引擎還支援到Unicode語法的話,你也可以使用Unicode在正規表示式當中,就像是歐元的符號0x20AC,你可以使用”\u20AC”來表示,注意一下,可不是”\x20AC”喔!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s