java中的正則表達式(一)


    最近在學習springMVC的源碼並嘗試從零開發一下web框架。在學習用遇到了一個攔路虎————正則表達式。在我平時的開發工作中對於正則表達式的使用並不是很頻繁,可以說是幾乎不用,即使用到了都是通過上網百度查詢,久而久之正則表達式成了我的短板(雖然這塊短板還沒有影響我的工作)。在看了springMVC的框架后發現,其實正則表達式在封裝框架中起着至關重要的作用,因此熟練的掌握正則表達式可以幫助我們學習底層的代碼邏輯。

    正則表達式:是一串字符,它描述了一種文本模式。這句話取自java編程的邏輯。正則表達式中的字符有兩類,一類是普通字符用來匹配其本身,一類是元字符,這類字符有特殊的含義。這里需要注意一點,正則表達式有它自己的語法,許多的編程語言都支持正則表達式但是可能不同的語言對於正則表達式的語法解析是不同的,這里我介紹的是java中的正則表達式。

    1.單個字符

    絕大多數單個字符表示的就是其本身例如:‘A’,'B','C'。但是有一些字符是需要多個字符表示的,比如‘\n’換行 '\t'tab鍵。以八進制表示的字符要以‘\0’后面跟1~3位數字,以十六進制表示的字符要以‘\x’開頭后面跟兩個字符,以Unicode編號表示的字符要以‘\u’開頭后面跟4個字符。在正則表達式中還有一些元字符:?、*、. 需要表示這些字符本身需要使用‘\’來轉義例如:‘\?’,如果需要表示反斜杠本身需要'\\'即可。

    2.字符組

    在單個字符和任意字符中有一個字符組的概念表示匹配指定字符中的一個字符,在正則表達式中使用[]表示。例如:[sbcds]表示匹配s、b、c、d、s中的任意一個字符。為了方便的表示多個連接的字符,可以使用連字符‘-’來表示。[0-9]表示匹配0~9的任意一個字符;[a-z]表示匹配a~z的任意一個字符,如果需要匹配連接符‘-’可以把連接符寫在[-a-z]寫在最前面,也可以使用轉義字符進行轉義。在‘[’后面緊跟一個‘^’表示排除匹配,如果[^abcd]表示匹配除了abcd的任意字符,這里^在開頭才表示元字符如果不在開頭表示的就是普通的^。在字符組中除了[]\-^外,其他的元字符不具有任何特殊含義只表示其本身。有一些以\開頭的字符,表示一些預定義的字符組,比如:\d表示匹配一個數字字符等同於[0-9]、\w表示匹配一個單詞字符等同於[0-9a-zA-Z_]、\s表示匹配一個空白字符,它們都有對應的排除型字符組,只需要把\后面的字母修改成大寫即可。

    3.量詞

    量詞的作用是指定前面元字符出現的次數,我介紹的量詞有三個,分別是“+、*、?”。“+”表示匹配前面的原字符一次或多次、"*"表示匹配前面的字符零次或多次、“?”表示匹配前面的字符一次或零次。比起+、?、*使用更頻繁的是{m,n},叫做通用量詞表示前面的一個字符出現的次數最少m次,最多n次。如果n沒有限制,n可以省略。關於量詞有一個比較重要的是量詞默認都是貪婪的,比如有這樣的一個正則表達式:"<a>.*</a>",如果用這個表達式器匹配<a>e</a><a>b</a>,默認只會匹配一次而不是去分別匹配,遇到這種情況如果希望正則表達式去分配匹配可以在量詞的后面加上一個‘?’也就是<a>.*?</a>。

    4.分組

    正則表達式可以用()表示分組,例如:“a(bcd)ef”,其中bcd就是一個分組。在正則表達式中每一個分組都有一個序號,默認從1開始從左向右遞增,其中a(bcd)ef這表達式的第一個分組就是bcd。分組后可以使用量詞修飾,比如“a(bcd)?ef”表示可以匹配abcdef也可以匹配aef。在使用分組()和元字符“|”結合可以實現和[]類似的功能表示匹配其中的一個字符例如:(aa|bb|cc)。在正則表達式中可以通過\加分組序號來表示之前匹配的分組,這就叫做回溯引用,例如:<(\w+)>aa</\1>其中\1表示的是匹配之前的分組<(\w+)>。使用數字序號分組有時可能會讓用戶混淆所以這時我們可以使用命名分組,對於聲明命名分組的語法是:(?<name>X),引用分組的語法是:\k<name>,例如:<:(?<test>\w+)></\k<test>>。

    5.邊界匹配

    在正則表達式中我們除了可以指定字符的匹配規則也可以指定字符的邊界的匹配規則。我只介紹幾種常用的邊界匹配符號。1.邊界^:表示匹配整個字符串的開始,例如^abc表示匹配以abc開頭的字符串。注意如果在多行匹配模式下^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。2.邊界$:表示匹配整個字符串的末尾,如果設置的多行匹配模式$也匹配 ’\n’ 或 ’\r’ 之前的位置。3.\z表示匹配字符串結束的邊界,包括換行符。4.\b表示匹配單詞的邊界,這個邊界的要求是要求匹配的邊界一邊是單詞而另一邊不是單詞才能匹配。

    6.環視邊界匹配

    環視邊界匹配表示的也是字符串的邊界匹配,分別有對字符串的左邊邊界匹配和對右邊邊界匹配,我主要介紹四種環視邊界匹配。1.肯定順序環視,表示指定字符串邊界的右邊字符串的匹配模式,語法為:(?=...),例如:abc(?=23)表示可以匹配abc23但是不能匹配abc2。2.否定順序環視,表示指定字符串邊界的右邊字符串不能匹配的模式,語法為:(!=...),例如:abc(!=23)表示除字符c后面不匹配有23的字符串。3.肯定逆序環視,表示指定字符串邊界的左邊字符串的匹配模式,語法為:(?<=...),例如:(?<=\d)abc表示字符串abc的左邊必須是[0-9]的數字。4.否定逆序環視,表示指定字符串邊界的左邊字符串不能匹配的模式,語法為:(?<!...),例如:(?<!\d)abc表示字符串abc的左邊不能是[0-9]的數字。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM