将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'

有任何工具或STH自动执行吗?

应该意识到,从一般意义上说,不可能将ABNF转换为正则。

这是因为Regexes创建了常规语言,而ABNF规格创建了无上下文的语言。

可以通过有限状态机器(也用于正则匹配)来解析普通语言使用野牛/YACC工具实施)。

侧面注意:正则弦字符串本身无法通过Regex表达式有效。这是因为允许有括号/括号,而括号/括号匹配不适用于正则是正面的,而是使用上下文免费的语法。

从ABNF转换为正则是一部分案件的翻译。我想如果ABNF不递归或不包含任何环状定义,则是这种情况。这是上述自动翻译工具的(隐式)限制。

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

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引擎上效果很好。

对于较小的abnfs,用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一样,它仅输出空白。因此,我目前正在寻找其他工具,并在珀尔(Perl)中找到了一个怪异的小剧本,大约17年前用露比(Ruby)编写了一个怪异的脚本,最后一次致力于7年前。后者看起来很有希望,因为它实际上为Uri ABNF提供了正格,但我仍然需要使其正常工作。

最新更新