0

関数で文字列のパターン マッチングを行いたいのですが、文字列を部分文字列に分割するのに問題があります。のような文字列と取得したい"ccaabbccaacc"正規表現、壊れた部分文字列を含むリストが必要です。部分文字列のすべての部分を返すこの関数を作成しました"a*b*c*"["cc", "aabbcc", "aacc", ""]

parts :: [a] -> [[[a]]]
parts [ ] = [[ ]]
parts [c] = [[[c]]]
parts (c : cs) = concat [[(c : p) : ps ,[c] : p : ps] | p : ps <- parts cs]

しかし、すべての結果に対して一致関数を適用すると、必要なものが返され、結果をフィルタリングする方法がわかりません。誰かが私を助けることができますか?

4

1 に答える 1

1

この質問は解析に関するものだと思います-文字列を、「a*b*c*」など、特定の正規表現に一致する最大のチャンクに分割したいということです。

これは、正規表現のみを使用した、反復レクサー アプリケーションのようなものです。関数の存在を仮定

reglex :: String -> String -> (String, String)

これは、正規表現文字列、入力文字列を取り、最長一致プレフィックスのペアと残りの入力文字列を返します。次のように記述できます。

import Control.Arrow

parts reg str = ($ ("",str)) $
   iterate (reglex reg . snd) >>>
   tail >>>
   span (not.null.fst) 

そして、この結果で何かをします。

于 2013-04-28T20:56:34.990 に答える