将ABNF规则转换为REGEX

时间:2014-01-26 21:30:30

标签: regex abnf

我需要将下述ABNF规则( mlaer )转换为REGEX

   mlaer       =  1*( lebal "." ) lebal
   lebal       =  gid-tel *(rts-hdl)

   rts-hdl    =  *( alpha / digit / "-" ) gid-tel
   gid-tel    =  alpha / digit
   alpha       =  %x41-5A  ; 'A'-'Z'
   alpha       =/ %x61-7A  ; 'a'-'z'
   digit       =  %x30-39  ; '0'-'9'

是否有任何工具或自动执行此操作?

2 个答案:

答案 0 :(得分:0)

不确定是否有任何工具可以自动执行此操作,但这并不太难。

gid-tel

[A-Za-z0-9]

rts-hdl

[A-Za-z0-9-]*[A-Za-z0-9]

lebal

[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*

请注意,以此形式编写的lebal将导致NFA引擎在某些类型的输入上运行很长时间。它应该重写为:

[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?

mlaer

([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?

您可以使用字符串连接来构造复杂的正则表达式。这将允许您编写干净的代码。虽然lebal的情况需要修改语法,以便它在NFA引擎上运行良好。

答案 1 :(得分:0)

对于较小的ABNF this在线工具written in PHP为我工作。就您而言,它返回:

gid-tel: ^([A-Z][a-z0-9])$
rts-hdl: ^(([A-Z][-a-z0-9])*([A-Z][a-z0-9]))$
lebal: ^([A-Z][a-z0-9])((([A-Z][-a-z0-9])*([A-Z][a-z0-9])))*$
mlaer: ^(([A-Z][a-z0-9])((([A-Z][-a-z0-9])*([A-Z][a-z0-9])))*\.)+([A-Z][a-z0-9])((([A-Z][-a-z0-9])*([A-Z][a-z0-9])))*$

但是对于较大的ABNF(例如用于电子邮件地址的ABNF),它仅输出空白。因此,我目前正在寻找其他工具,并在大约17年前找到了weird, small script in Perl和一个written in Ruby,最近一次是在7年前。后者看起来很有希望,因为它实际上为URI ABNF提供了RegEx,但我仍然需要使其正常工作。