我必須簡化決議為某種資料型別的自定義正則運算式。對于“簡化”,我的意思是以下(強調我的):
鑒于規則:
- 小寫字母匹配自己,例如:
a匹配a,僅此而已- 僅包含字母的括號匹配它們的完整序列,例如:
(abc)匹配abc,僅此而已- 僅包含字母的方括號匹配里面的每個字母,例如:
[abc]匹配aandb和cand 沒有別的以下都是有效的:
(a[bc])比賽ab,ac沒有別的[a(bc)]比賽a,bc沒有別的(a(bc))(abc)與和匹配相同abc,僅此而已[a[bc]]等同于[abc]and 匹配aandbandcand 沒有別的正則運算式可以簡化。例如
[a[[bb]b[[b]]](c)(d)], 實際上與[abcd]which 匹配a,和是b一樣的。cd
我在 Haskell 中使用attoparsec以下目標資料型別實作了一個簡單的決議器組合器:
data Regex
= Symbol Char
| Concat [Regex] -- ()
| Union [Regex] -- []
deriving (Eq)
但是,我真的在簡化部分苦苦掙扎。我嘗試通過展開它們、nubbing和concatMappingConcat的組合來減少s 和s ,但無濟于事。我認為我定義的資料型別可能不是最合適的,但我已經沒有想法了(在這里深夜)。你能幫我看看正確的方向嗎?謝謝!Union
simplify :: Regex -> Regex
simplify (Symbol s) = Symbol s
simplify (Concat [Symbol c]) = Symbol c
simplify (Concat rs) = Concat $ simplify <$> rs
simplify (Union [Symbol c]) = Symbol c
simplify (Union rs) = Union $ nub $ simplify <$> rs
uj5u.com熱心網友回復:
對于初學者,您缺少一些簡單的改進。simplify (Concat [x]) = x對于 Union 也是如此:包裝的正則運算式不需要特別是一個符號。
然后你需要開始查看Concat包含其他Concats 的 s,同樣對于Union. 當然,您首先要簡化包裝串列的元素,但在將結果重新放入包裝器之前,您使用相同的包裝器提升任何元素。就像是:
simplify (Concat xs) =
case concatMap liftConcats (map simplify xs) of
[x] -> x
xs -> Concat xs
where liftConcats :: Regex -> [Regex]
liftConcats r = _exerciseForTheReader
然后你可以為 Union 做類似的事情,也可以加入nub。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/419693.html
標籤:
上一篇:括號和逗號的正則運算式組合
