1. 程式人生 > 其它 >正則匹配查詢_正則表示式學習筆記(二):元字元

正則匹配查詢_正則表示式學習筆記(二):元字元

技術標籤:正則匹配查詢

前言

上一篇文章中我們介紹了將要學習的正則表示式的執行環境,從這一節開始我們來研究一下正則表示式中的元字元,只要明白了元字元,那麼第一篇文章例子中的程式碼我們就可以看得懂了。 元字元是正則表示式的靈魂,它們雖然為數不多,但正是這些“小精靈”們構成了可實現各種各樣功能的正則表示式,為了對它們進行深入理解,我將在文中對每一種元字元都舉例說明,儘管這樣一來篇幅顯得較長,但對於那些願意一起學習的同學而言,多動手來練習一下文中的程式碼,相信一定會對這些元字元有更深的印象。

行的起止符

在正則表示式中,要匹配以某個字元開頭的字串,是用^這個符號,這個符號很多教材上稱之為脫字元
,要匹配以某個字元結尾,是用$,這個符號叫做美元符號。 比如我們要在一行文字中查詢某個單詞,用Perl語句可以這樣表示:
$value = 'Hello';if ($value =~ m/^Hello$/){    print "Hello已經找到!\n"}

ffceae9d1e04ff6527579ff13e68a147.png

在上述Perl程式中,=~是匹配符號,m/.../是表示其中的字串是正則表示式,在這一小段程式碼中,之所以查詢成功,是由於我們給出的變數只有一個單詞Hello,如果將變數設定為Hello World!,那麼程式就無法匹配成功,因為修改後的文字儘管是以H開頭,並且之後的幾個字元ell都分別匹配成功,但卻不是以字元o結尾,因此無法匹配成功。 從這個小例子可以看出,^
$符號是一行字串的起止符,並非一行字串中某個單詞的起止符。 用Python中的re正則包表示如下:

a96b693bb5497d56ee3aa4b8f4a1e8a9.png

從上述輸出結果可以看出,同樣的正則表示式在 Python 中也是可以匹配成功的,但更改一下 value 值,則無法匹配到結果:

ae384f08240d139ed98fa6a8d2882ef4.png

字元組

在正則表示式中,字元組是一個很重要的概念,它是一組字元的組合,用中括號[]括起來,在中括號裡面可以是任意的字元組合,比如在一篇文章中,由於某人習慣性手誤,會把hello寫成hella,在校對時,需要將所有hella和所有hello查詢出來進行格式設定,則正則表示式可以這樣寫:
$value = 'Hello world! Hella world!';if ($value =~ m/Hell[oa]/){    print "Hello已經找到!\n"}

53a4f8cc2b98792654e8f7176c19f118.png

Python則如下表示:

63e83f989ab90d114f12aa002c70f107.png

關於字元組要注意的是,它是單個字元的組合! 另外,還有一種簡便方法來書寫字元組,比如要匹配的是單個數字,則可以這樣書寫:[0-9],它表示[0123456789],其中的-叫做連字元,它只對一類連續的字元起作用,比如要匹配小寫字母,我們可以這樣寫[a-z],類似地,大寫字母可以這樣寫[A-Z],甚至我們可以對其進行任意組合:[0-5a-mC-F]。 然而,當連字元-位於字元組第一個位置時,它只是相當於一個普通的字元,例如[-12],它只匹配-、1、2這三個字元。 甚至如果將不具備連續性質的字母用-連線起來,從形式上看,-雖然起到連字元的作用,但由於前後字元不連續,因此程式會報錯,比如:

a212df904be944635578274045d80bff.png

2e2779de6ced3cee4c75d4967abd66a7.png

排除型字元組

有時候我們可能會在查詢特定字串時,排除某個特定位置的字元,比如要在hello5 world中查詢含有hello但其結尾不是以數字結尾的單詞,給定的這個示例中沒有滿足條件的單詞,匹配程式碼書寫如下:
$value = 'hello5 world';if ($value =~ m/hello[^0-9]/){    print "已經找到!\n"}else{    print "沒有找到!\n"}

cc6b7b79598e45350080de4133dcfc03.png

如果將變數的值更改為helloT world,則會查詢成功,Python程式碼示例如下:

0023589bfca170892bb1132947490e00.png

從上述程式碼中可知,在字元組中,當第一個字元是^時,則表示該字元組中的其它所有字元不應該被匹配,但要注意,既然在正則表示式中添加了這個排除字元組,那它意味著該位置必須有一個字元,如果變數更改為hello,則用上述例子中的正則表示式無法匹配成功:

497efb379c38da07a4eff0f0c552a3de.png

點號匹配任意字元

在正則表示式中,.這個符號稱為點號,它可以匹配任意字元,因此當需要查詢一個位置是否有字元,只需要用它來查詢即可,當給出的字串是空時,它會提示匹配不成功,perl程式碼如下:
$value = '';if ($value =~ m/./){    print "已經找到!\n"}else{    print "沒有找到!\n"}

deabd2188187ce81d30b21ce8f872cbf.png

Python中,返回的是空列表: a43e768fdf30f85b8c9b25a406687fea.png 由於.在日常應用很廣,比如小數點,比如數字IP地址分隔符等,這時我們可以用字元組來實現匹配:

a4e0780e055e0742e323c26548ba649f.png

小結

本文介紹了正則表示式的三種元字元,分別是行起止符、字元組和點號,並針對每一種元字元均給出了一些例子,其中,字元組這個概念非常重要,它在我們今後的規則編寫中起著極其重要的作用。