[英]Regex capturing named groups in a language that doesn't support them using a meta regex?
我正在使用Haskell,但似乎找不到支持命名組的REGEX軟件包,因此我必須以某種方式自己實現。 基本上,我的api用戶將使用帶有正則表達式組的正則表達式來獲取地圖中捕獲的組,因此
/(?P<name>[a-z]*)/hhhh/(?P<surname>[a-z]*)/jjj on /foo/hhhh/bar/jjj
會給
[("name","foo"),("surname","bar")]
我正在使用相對較小的字符串進行規范的瑣碎實現,因此目前性能不是主要問題。
為了解決這個問題,我想我會寫一個元正則表達式,將其應用於用戶的正則表達式
/(?P<name>[a-z]*)/hhhh/(?P<surname>[a-z]*)/jjj
提取組的名稱並將其替換為空
0 -> name
1 -> surname
正則表達式變為
/([a-z]*)/hhhh/([a-z]*)/jjj
然后將其應用於字符串,並使用索引對匹配的名稱進行分組。
兩個問題:
對於那些不熟悉命名組的人http://www.regular-expressions.info/named.html
注意:我只需要命名組中的用戶為匹配項命名,因此只給我提供命名組的子集是可以的。
您越想廣泛地應用解決方案,問題就越復雜。 例如,在您的方法中,您要刪除命名的組並使用索引(索引?)進行匹配。 這似乎是一個好的開始,但是您需要考慮以下幾點:
(?<name>blah)
替換為(blah)
則還必須用/或/ 1或/ 2替換/ name。 ([az]{3})/(?P<name>[az]*)/hhhh/(?P<surname>[az]*)/jjj on /foo/hhhh/bar/jjj
。 在這種情況下,您的編號將不起作用b / c組1是用戶定義的非命名組。 看到這篇文章有些迷惑,因為似乎其他人也成功地嘗試了相同的方法(盡管在Java中)
也許您應該使用解析器組合器。 這看起來非常復雜,以至於退出並使用Parsec或Attoparsec會更干凈和更易於維護,而不是嘗試將正則表達式進一步推向解析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.