正則匹配查詢_正則表示式學習筆記(二):元字元
阿新 • • 發佈:2021-01-26
技術標籤:正則匹配查詢
前言
上一篇文章中我們介紹了將要學習的正則表示式的執行環境,從這一節開始我們來研究一下正則表示式中的元字元,只要明白了元字元,那麼第一篇文章例子中的程式碼我們就可以看得懂了。 元字元是正則表示式的靈魂,它們雖然為數不多,但正是這些“小精靈”們構成了可實現各種各樣功能的正則表示式,為了對它們進行深入理解,我將在文中對每一種元字元都舉例說明,儘管這樣一來篇幅顯得較長,但對於那些願意一起學習的同學而言,多動手來練習一下文中的程式碼,相信一定會對這些元字元有更深的印象。行的起止符
在正則表示式中,要匹配以某個字元開頭的字串,是用^
這個符號,這個符號很多教材上稱之為脫字元$
,這個符號叫做美元符號。
比如我們要在一行文字中查詢某個單詞,用Perl
語句可以這樣表示:
$value = 'Hello';if ($value =~ m/^Hello$/){ print "Hello已經找到!\n"}
在上述Perl
程式中,=~
是匹配符號,m/.../
是表示其中的字串是正則表示式,在這一小段程式碼中,之所以查詢成功,是由於我們給出的變數只有一個單詞Hello
,如果將變數設定為Hello World!
,那麼程式就無法匹配成功,因為修改後的文字儘管是以H
開頭,並且之後的幾個字元ell
都分別匹配成功,但卻不是以字元o
結尾,因此無法匹配成功。
從這個小例子可以看出,^
$
符號是一行字串的起止符,並非一行字串中某個單詞的起止符。
用Python
中的re
正則包表示如下:
從上述輸出結果可以看出,同樣的正則表示式在
Python
中也是可以匹配成功的,但更改一下
value
值,則無法匹配到結果:
字元組
在正則表示式中,字元組是一個很重要的概念,它是一組字元的組合,用中括號[]
括起來,在中括號裡面可以是任意的字元組合,比如在一篇文章中,由於某人習慣性手誤,會把hello
寫成hella
,在校對時,需要將所有hella
和所有hello
查詢出來進行格式設定,則正則表示式可以這樣寫:
用$value = 'Hello world! Hella world!';if ($value =~ m/Hell[oa]/){ print "Hello已經找到!\n"}
Python
則如下表示:
關於字元組要注意的是,它是單個字元的組合!
另外,還有一種簡便方法來書寫字元組,比如要匹配的是單個數字,則可以這樣書寫:[0-9]
,它表示[0123456789]
,其中的-
叫做連字元,它只對一類連續的字元起作用,比如要匹配小寫字母,我們可以這樣寫[a-z]
,類似地,大寫字母可以這樣寫[A-Z]
,甚至我們可以對其進行任意組合:[0-5a-mC-F]
。
然而,當連字元-
位於字元組第一個位置時,它只是相當於一個普通的字元,例如[-12]
,它只匹配-、1、2
這三個字元。
甚至如果將不具備連續性質的字母用-
連線起來,從形式上看,-
雖然起到連字元的作用,但由於前後字元不連續,因此程式會報錯,比如:
排除型字元組
有時候我們可能會在查詢特定字串時,排除某個特定位置的字元,比如要在hello5 world
中查詢含有hello
但其結尾不是以數字結尾的單詞,給定的這個示例中沒有滿足條件的單詞,匹配程式碼書寫如下:
$value = 'hello5 world';if ($value =~ m/hello[^0-9]/){ print "已經找到!\n"}else{ print "沒有找到!\n"}
如果將變數的值更改為helloT world
,則會查詢成功,Python
程式碼示例如下:
從上述程式碼中可知,在字元組中,當第一個字元是^
時,則表示該字元組中的其它所有字元不應該被匹配,但要注意,既然在正則表示式中添加了這個排除字元組,那它意味著該位置必須有一個字元,如果變數更改為hello
,則用上述例子中的正則表示式無法匹配成功:
點號匹配任意字元
在正則表示式中,.
這個符號稱為點號,它可以匹配任意字元,因此當需要查詢一個位置是否有字元,只需要用它來查詢即可,當給出的字串是空時,它會提示匹配不成功,perl
程式碼如下:
$value = '';if ($value =~ m/./){ print "已經找到!\n"}else{ print "沒有找到!\n"}
在Python
中,返回的是空列表:
由於.
在日常應用很廣,比如小數點,比如數字IP地址分隔符等,這時我們可以用字元組來實現匹配: