正則表達式的語法和簡單應用

在Java中,藉助於String類的一系列方法,咱們已經能夠對字符串作簡單的處理:好比求子串、查找字符、格式化字符串、字符串替換等等。正則表達式則提供了更爲強大的對字符串的處理操做,是一種強大而靈活的文本處理工具。正則表達式

正則表達式對文本的匹配流程以下圖所示:數組

簡單的說,正則表達式就是以特定的語法規則描述一個字符串:若是待匹配文本的內容符合正則表達式的內容,則匹配成功;不然匹配失敗。app

正則表達式的語法工具

正則表達式的語法主要分爲:單個字符、字符集、邏輯操做符、捕獲組、數量詞、邊界匹配符等若干部分。spa

1、單個字符blog

一、通常的字符:這裏的字符包括字母(大小寫)、數字、符號等,語法原則是匹配自身。好比正則表達式爲「abc」,那麼有且只能是「abc」文本才能匹配成功。作用域

二、任意字符.:.字符語法原則是與任意字符匹配。好比正則文本「a.c」能夠匹配「axc」文本。字符串

三、轉義字符\:使後面的一個字符具備特定的意義。語法原則與通常的轉義字符用法一致,好比"a\.c"則只能與「a.c」匹配。get

2、字符集數學

一、通常字符集[...]:注意,字符集並不表示一個集合所有內容,表示的是這個集合中的任一一個元素的含義。好比,"[abc]"表達的含義與"abc"徹底不一樣,前者表達abc中任一一個字符的含義。通常字符集的語法規則是方括號[ ]內顯示地表達元素集合:能夠選擇逐一列出,如[abcde];還能夠選擇用-符號表示範圍,好比[a-z]表示小寫英文字母的集合中的任意一個字符。特別地,若是範圍比較分散而元素又太多了很差一一列舉,能夠取集合中補集的概念,在[ ]中開始位置用^表示「排除」、「取反」、「取補集」的含義,好比[^abc]表示除了abc之外的任意一個字符。

二、預約義字符集:爲了方便使用,不須要每次都須要本身用[...]語法表示,正則表達式引擎預先提供了一些字符集,主要有:

①\d:至關於「[0-9]」,即數字字符。

②\s:至關於「[\t\r\n\f]」,即空白字符。

③\w:至關於"[a-zA-Z0-9]",即單詞字符。

④以上三種字符集,分別取補集,爲了方便記憶用對應大寫字母表達,即獲得\D(非數字字符) \S(非空白字符) \W(非單詞字符)等字符集。

切記:不管是通常字符集[...]仍是預約義字符集,表達的都是「一個」字符的概念:一個字符集合中任意一個字符!

3、邏輯操做符

邏輯操做符指的是,若是一個正則表達式中既有字符又有字符集還有其餘的語法元素時,這些元素之間的邏輯關係是怎樣的。主要有:

一、XY:順序結構,Y跟在X後面,因此語法原則是先檢查X,若是匹配再檢查Y。

二、X|Y:「或」關係,左右兩個表達式只須要知足一個即表示文本匹配成功。因此,若是X匹配成功,則直接跳過Y的檢查。

4、捕獲組(capturing group)

捕獲組很是容易與字符集混淆:首先,二者形式不一樣:前者是(...),後者是[...]。而後,二者含義不一樣:前者表示的是實打實的集合總體,後者則是總體中的任意一個元素。

捕獲組語法很是簡單:圓括號(...),好比"a(bc)d"只能與"abcd"匹配成功。

切記,正則文本中不管是捕獲組的圓括號仍是字符集的方括號,都是不參與匹配的,由於它們只是表示正則的語法元素而已!

能夠了解一下捕獲組幾個重要的用法:

捕獲組的編號:捕獲組是能夠嵌套的,這就像數學表達式中圓括號能夠"一對套一對"同樣。捕獲組能夠所以能夠編號:編號從0開始(即所有正則文本內容),最外層括號包含的內容爲第1組,依次按層次編號便可。好比有一個正則文本"a(b(c)d(e))f",第0組爲abcdef,第1組爲bcde,第2組爲c 和 e。

捕獲組的命名:除了編號外,還能夠給捕獲組命名,命名語法爲:(?P<name>...),其實就是在捕獲組內容前面加上?P<name>便可,其中的name即爲該組的組名。

捕獲組的編號和命名,本質都是爲了在一個正則文本中將多個捕獲組區分開。那麼區分不一樣的捕獲組的意義在哪?就是爲了引用捕獲組。由於捕獲組表明某個字符集合總體,而咱們但願正則表達式儘可能簡潔,因此在不一樣的地方使用一樣的捕獲組的時候,用引用代替重複的文本。具體以下:

捕獲組的編號引用:引用語法爲"\x".  其中,x爲想引用的捕獲組編號。好比,對於正則文本"(abc)d\1",「abcdabc」文本才能與它匹配。顯然這裏\1是對第1組的引用。

捕獲組的名稱引用:引用語法爲"(?P=name)". 其中,name爲引用的捕獲組名稱,因爲捕獲組編號是系統自動追加的,而捕獲組名稱是用戶本身添加的,因此必須保證該名稱確實被命名一個捕獲組過。另外,這裏的圓括號與?都不能省略。好比:正則文本"a(?P<happy>bc)d(?P=happy)",與其匹配的文本應當爲"abcdbc"。

捕獲組至關於將若干個通常字符與其餘部分隔離開,可是這種隔離並不是是沒有意義的;經過這種隔離能夠實現特定的匹配含義。稍後,說明這一點。

5、數量詞

 至此,你們可能會有疑惑:咱們目前表示的正則表達式,與其匹配的文本都是惟一肯定的,那咱們爲何不直接用String表示字符串得了?當有了數量詞後,正則表達式才具備了真正的強大的靈活性。數量詞能夠用於字符(包括單個字符與字符集)後面或者捕獲組後面。

若是數量詞用於單個字符或字符集後面,這兩者表達的都是一個字符的概念,因此數量詞做用域爲前面這一個字符!若是數量詞用於捕獲組後面,數量詞做用域爲整個捕獲組總體字符集合。

一、X* 表示X能夠出現0次或屢次。對於正則文本"ab*",則文本"a"、"ab"、"abb"均可以與其匹配。對於正則文本「a(bc)*」,則文本"a"、"abc"、"abcbc"能夠與其匹配。這裏的兩個例子也恰好能夠看出數量詞對單個字符/字符集和捕獲組的不一樣做用域(其實只需將捕獲組看做是一個總體便可)。

二、X+ 表示X出現一次或屢次。

三、X?    表示X出現0次或者1次。

四、{m} 表示X出現m次。

五、{m,n} 表示X出現次數在m到n次之間。若省略m,則變成{,n},表示X出現次數在0到n之間。若是省略n,變成{m,},表示X出現次數在m到無限次之間。注意,省略m或n時,花括號中的逗號切不可省略,不然就變成上一種狀況了。

6、邊界匹配符

邊界匹配符用來控制匹配文本時的匹配位置進一步提高了正則表達式的靈活性,:好比在開頭匹配或在末尾匹配等。這裏略。

正則表達式具備強大的靈活性,同一個正則文本,可能有多個甚至無數個文本能夠與其匹配成功。可是不少狀況下,咱們不須要這麼多匹配成功的文本。這涉及到一個正則匹配「貪婪型」、「非貪婪型」的問題。

正則匹配過程默認是貪婪型的:即貪婪正則表達式會在已經找到一個符號匹配的文本後繼續往下吸取文本。

能夠手動將正則表達式指定爲非貪婪型,方式是在數量詞後面加上?。這樣非貪婪表達式會匹配知足表達式的最少字符數的文本。即*?  +?  ??  {m,n}?等。

正則表達式的簡單應用

正則表達式對於文本處理而言很是強大,這裏只介紹簡單的應用。

一、匹配檢查:String類的實例方法matchs(String regex)可用來檢查字符串是否匹配參數中的正則表達式。

二、字符串分割:String類的實例方法split(String regex)可用來切分字符串,返回一個切分後的字符串數組。該方法遇到符合正則表達式內容的內容時,進行切割,最後結果是忽略了該部份內容,本來的字符串變成一段段的子串,以字符串數組的形式返回。

三、字符串替換:儘管String類已經提供了replace(String target,String replacement)方法用來進行字符串替換的操做。可是使用正則表達式更靈活,主要有如下兩種方式:

①replaceAll(String regex,String replacement)

②replaceFirst(String regex,String replacement)

這兩種方法都是String類的實例方法,做用都是尋找符合參數一正則表達式內容的部分,用參數二的字符串替換。兩者的區別在於後者只替換第一次匹配成功的文本,前者替換所有匹配成功的文本。

————————over。

相關文章
相關標籤/搜索