2017-08-02 28 views
1

私はハスケルでこれを行うことができるように、このような質問のHaskellにpython regex(PCRE)Haskellの2つの部分文字列の間の文字列を抽出します。

しかし私はGHC(8.2.1)でそれを動作させる方法を理解できません。私はcabal install regex-pcreをインストールし、いくつかの検索の後に、次のテストコードを思い付いてきました:

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

「私は

iwantthis 

の真ん中の文字列の最初と最後のインスタンスを取得するために期待していた。しかし、私はすることができますtは正しい結果を得る:

[[ "ASDF = 5; iwantthis123jasd --- +++ ASDF = 5; iwantthis123jasd"、 "iwantthis123jasd --- +++ ASDF = 5; iwantthis"]]

以前はHaskellでregexや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(全体正規表現)であり、要素は、捕捉のあります。だから、まだasdf=5;との間で一致した

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

:グループ1((.*)と一致するもののようにそれが一致するので、部分。

これは、Kleeneの開始がの欲望と一致するためです。これは、できるだけキャプチャすることを目的としています。あなたは非欲張り数量詞を使用することが(.*?)を使用することができます。

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

をそして今、我々はマッチを得ます。

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

'マップ(!!は、1)'より読みやすいかもしれません:各試合は1

あなたは(.*?)一部のキャプチャのリストを取得するためにmap (head . tail)またはそれにmap (!!1)を使用することができますキャプチャグループとして"iwantthis"を持っています番号はキャプチャグループを示すためです。 – 4castle

関連する問題