Groovy Tip 29 正規表示式 三

2021-04-28 00:29:55 字數 3368 閱讀 2206

groovy tip 29  正規表示式 三

本篇主要來談談"捕獲組"和"非匹配組"以及與它們相關聯的一些概念。

"捕獲組"應該來說是乙個很重要的特性,特別是在進行文書處理的時候。比如,我們經常會遇到一些文字或數字跟一些符號混合在一起,而我們需要把這些文字或數字從這些符號中分離出來。這時候,我們就可以用到"捕獲組"。

[email protected]

我們需要從上面的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 語言中,正規表示式的匹配運算非常簡單。麻煩的是一些萬用字元需要記住,然後加以靈活運用。...