【问题标题】:Regex capturing named groups in a language that doesn't support them using a meta regex?正则表达式以不支持使用元正则表达式的语言捕获命名组?
【发布时间】:2011-03-05 10:58:08
【问题描述】:

我正在使用 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

注意:我从命名组中需要的只是用户为匹配项命名,因此只给我这个的命名组的子集就可以了。

【问题讨论】:

  • 那么你最后做了什么?我实际上也需要命名组

标签: regex haskell


【解决方案1】:

您想应用解决方案的范围越广,您的问题就会变得越复杂。例如,在您的方法中,您希望删除命名组并使用索引(索引?)进行匹配。这似乎是一个好的开始,但您已经考虑了一些事情:

  1. 如果您将 (?&lt;name&gt;blah) 替换为 (blah),那么您还必须将 /name 替换为 /1 或 /2 或其他任何内容。
  2. 如果用户也包含未命名的组会怎样?例如:([a-z]{3})/(?P&lt;name&gt;[a-z]*)/hhhh/(?P&lt;surname&gt;[a-z]*)/jjj on /foo/hhhh/bar/jjj。在这种情况下,您的编号将不起作用 b/c 组 1 是用户定义的未命名组。

请参阅此帖子以获取一些启发,因为似乎其他人已成功尝试过相同的尝试(尽管在 Java 中)

Regex Named Groups in Java

【讨论】:

  • 是的。实际上,如果组名的数量!=捕获的组数,我打算引发错误
【解决方案2】:

也许您应该使用解析器组合器。这看起来非常复杂,因此退出并使用ParsecAttoparsec 会更简洁,更易于维护,而不是尝试将正则表达式进一步推向解析。

【讨论】:

  • 嗨,唐,实际上命名组正则表达式在我的示例中用作用户将用来指定 url 模式的语言。所以 Parsec 没有帮助,除非您建议我使用 parsec 或编写我自己的 DSL 而不是使用命名组来实现 Regex 命名组规范
猜你喜欢
  • 2019-01-18
  • 1970-01-01
  • 2019-03-17
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多