簡體   English   中英

正則表達式使用元正則表達式以不支持命名語言的語言來捕獲命名組?

[英]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 

然后將其應用於字符串,並使用索引對匹配的名稱進行分組。

兩個問題:

  1. 似乎是個好主意嗎?
  2. 我需要捕獲和替換命名組語法的元正則表達式是什么

對於那些不熟悉命名組的人http://www.regular-expressions.info/named.html

注意:我只需要命名組中的用戶為匹配項命名,因此只給我提供命名組的子集是可以的。

您越想廣泛地應用解決方案,問題就越復雜。 例如,在您的方法中,您要刪除命名的組並使用索引(索引?)進行匹配。 這似乎是一個好的開始,但是您需要考慮以下幾點:

  1. 如果將(?<name>blah)替換為(blah)則還必須用/或/ 1或/ 2替換/ name。
  2. 如果用戶還包括未命名的組,會發生什么情況? 例如: ([az]{3})/(?P<name>[az]*)/hhhh/(?P<surname>[az]*)/jjj on /foo/hhhh/bar/jjj 在這種情況下,您的編號將不起作用b / c組1是用戶定義的非命名組。

看到這篇文章有些迷惑,因為似乎其他人也成功地嘗試了相同的方法(盡管在Java中)

正則表達式用Java命名組

也許您應該使用解析器組合器。 這看起來非常復雜,以至於退出並使用ParsecAttoparsec會更干凈和更易於維護,而不是嘗試將正則表達式進一步推向解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM