groovy tip 29 正規表示式 三
本篇主要來談談"捕獲組"和"非匹配組"以及與它們相關聯的一些概念。
"捕獲組"應該來說是乙個很重要的特性,特別是在進行文書處理的時候。比如,我們經常會遇到一些文字或數字跟一些符號混合在一起,而我們需要把這些文字或數字從這些符號中分離出來。這時候,我們就可以用到"捕獲組"。
我們需要從上面的email位址中分離出"fgp"、"sina"和"com"來,如果使用"split"方法的話,我們需要做兩次"split"動作才能達到我們的要求。
但是,如果使用"捕獲組"的話,我們只需要做一次動作。如:
defamail = '[email protected]'
defre = /(.*)@(.*)/.(.*)/
defmatcher = (amail =~ re)
printlnmatcher[0]
執行結果為:
["[email protected]", "fgp", "sina", "com"]
再舉乙個看起來有那麼一點點實用的例子,比如我們有如下的一組**表,由商品名稱、**以及它們所能打的折扣組成。
computer 3000¥ 10%
mouse 50¥ 0%
memory 200¥ 20%
現在,我們希望把商品名稱、**和打折分別提取出來。
使用"捕獲組"的**如下:
defgoods =
"""computer 3000¥ 10%
mouse 50¥ 0%
memory 200¥ 20%"""
defgroups =
goods.split('/n').each(groups)
執行上述**的結果為:
["computer 3000¥ 10%", "computer", "3000", "10"]
["mouse 50¥ 0%", "mouse", "50", "0"]
["memory 200¥ 20%", "memory", "200", "20"]
相比較而言,"非匹配組"的使用就更為複雜一些,這裡面除了"非匹配組"本身的概念,還有一些相關的概念需要說明。
首先要說明的是"最大匹配"和"最小匹配"的概念。在正規表示式中,我們的一些操作符,如"?"、"*"和"+"在預設的情況下,都是指的"最大匹配";如果需要需要"最小匹配",則需要在上述操作符後面加上"?"操作符,才能表示它們是"最小匹配"。
下面來舉乙個經典的例子來說明。比如我們有如下的乙個html語句:
abc
那麼,我們先進行如下的配置:
defhtml = 'abc'
defre = /<.*>/
defmatcher = (html =~ re)
printlnmatcher[0]
再進行如下的匹配:
defhtml = 'abc'
defre = /<.*?>/
defmatcher = (html =~ re)
printlnmatcher[0]
其中,第一段**就進行的就是"最大匹配",執行結果為:
abc
第二段**為"最小匹配",執行結果為:
所謂"非匹配組",指的是在乙個字串裡,有我們想要的匹配組,也有我們不想要的非匹配組。我們想要的匹配組好說,就是使用我們上面所說到的"捕獲組"來解決;那麼我們不想要的非匹配組,我們該怎麼處理呢?
要匹配"非匹配組",我們要做的工作其實是很簡單,就是括號,並且在括號裡以"?:"開頭。下面來舉乙個例子說明。
還是以上面的**表為例,比如我們有如下的**表:
computer intel cup 3000¥ 10%
mouse made in china mainland 50¥ 0%
memory made in taiwan 200¥ 20%
這個**錶比前面的**表更為複雜一些,中間夾雜了一些對商品的描述。現在,我們還是希望取出商品名稱、**和打折來,而不需要商品的描述。
這樣,我們就用到了"非匹配組",**如下:
defgoods =
"""computer intel cup 3000¥ 10%
mouse made in china mainland 50¥ 0%
memory made in taiwan 200¥ 20%"""
defgroups =
}goods.split('/n').each(groups)
執行結果為:
["computer intel cup 3000¥ 10%", "computer", "3000", "10"]
["mouse made in china mainland 50¥ 0%", "mouse", "50", "0"]
["memory made in taiwan 200¥ 20%", "memory", "200", "20"]
在上面的**中,正規表示式中的"(?: .+)+"就是"非匹配組"。值得注意的是,該正規表示式的開頭"(.*?)",就用到了"最小匹配"的概念,如果我們把其中的問號去掉,變成"最大匹配",那麼結果又將是什麼樣子呢?
defgoods =
"""computer intel cup 3000¥ 10%
mouse made in china mainland 50¥ 0%
memory made in taiwan 200¥ 20%"""
defgroups =
}goods.split('/n').each(groups)
執行結果為:
["computer intel cup 3000¥ 10%", "computer intel", "3000", "10"]
["mouse made in china mainland 50¥ 0%", "mouse made in china", "50", "0"]
["memory made in taiwan 200¥ 20%", "memory made in", "200", "20"]
可以看到,上面就不是我們想要的結果了。
Groovy Tip 35 正規表示式 四
groovy tip 35 正規表示式 四 我們知道,在正規表示式中,有一些字串被用來的表達一些特殊的用途。比如,代表的是所有的字元 代表的是非 等等。看到這些用法的時候,我們就可以反過來問了,如果 代表的是所有的字元的話,那麼用什麼來匹配字串中的 呢?為了解決這樣的問題,在正規表示式中需要用 加上...
Groovy Tip 16 正規表示式 一
groovy tip 16 正規表示式 一 在groovy語言中,增加了正規表示式的匹配運算子 乙個簡單的例子如下 println friends friends 列印結果為 true 可以看到,在 groovy 語言中,正規表示式的匹配運算非常簡單。麻煩的是一些萬用字元需要記住,然後加以靈活運用。...
Groovy Tip 16 正規表示式 一
groovy tip 16 正規表示式 一 在groovy語言中,增加了正規表示式的匹配運算子 乙個簡單的例子如下 println friends friends 列印結果為 true 可以看到,在 groovy 語言中,正規表示式的匹配運算非常簡單。麻煩的是一些萬用字元需要記住,然後加以靈活運用。...