2017-08-02 228 views
1

我想修改這個SO問題Find string between two substrings中的python正則表達式(PCRE)技術到Haskell,這樣我就可以在Haskell中做同樣的事情。提取Haskell中兩個子字符串之間的字符串

但我不知道如何使它在GHC(8.2.1)中工作。我已經安裝cabal install regex-pcre,以及一些搜索後,用下面的測試代碼上來:

import Text.Regex.PCRE 
s = "+++asdf=5;iwantthis123jasd---" 
result = (s ++ s) =~ "asdf=5;(.*)123jasd" :: [[String]] 

我希望得到中間串

iwantthis 

的第一個和最後一個實例,但我可以」噸得到正確的結果:

[[ 「ASDF = 5; iwantthis123jasd --- +++ ASDF = 5; iwantthis123jasd」, 「iwantthis123jasd --- +++ ASDF = 5; iwantthis」]]

我以前沒有在Haskell中使用正則表達式或pcre。

有人可以幫助正確的使用(提取第一次和最後一次出現)? 另外,我不太瞭解::[[String]]這裏的用法。它做什麼,爲什麼它是必要的?

我搜索了documentation,但未發現類型轉換爲:: [[String]]的用法。

回答

4

獲得的結果如下:

Prelude Text.Regex.PCRE> (s ++ s) =~ "asdf=5;(.*)123jasd" :: [[String]] 
[["asdf=5;iwantthis123jasd---+++asdf=5;iwantthis123jasd","iwantthis123jasd---+++asdf=5;iwantthis"]] 

這是正確的,所述第一元件是所述捕獲組0(整個正則表達式),並且元件是捕獲的。1組(匹配(.*)所述一個由於它匹配,如:

+++asdf=5;iwantthis123jasd---+++asdf=5;iwantthis123jasd---

所以它仍是asdf=5;和之間匹配部分。

這是由於Kleene開始*匹配貪婪這一事實:它旨在儘可能多地捕獲。您可以使用(.*?)但是使用非貪婪量詞:

Prelude Text.Regex.PCRE> (s ++ s) =~ "asdf=5;(.*?)123jasd" :: [[String]] 
[["asdf=5;iwantthis123jasd","iwantthis"],["asdf=5;iwantthis123jasd","iwantthis"]]

而現在我們得到匹配。每個匹配具有"iwantthis"作爲捕獲組1

可以使用map (head . tail)map (!!1)在其上,以獲得(.*?)部分的捕捉的列表:

Prelude Text.Regex.PCRE> map (!!1) ((s ++ s) =~ "asdf=5;(.*?)123jasd" :: [[String]]) 
["iwantthis","iwantthis"]
+0

'地圖(!! 1)'可能更可讀,因爲數字表示捕獲組。 – 4castle

相關問題