2

我需要将下面提到的 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'

有什么工具或某事可以自动完成吗?

4

2 回答 2

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 引擎上运行良好。

于 2014-01-27T00:26:19.073 回答
0

对于较小的 ABNF ,这个用 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提供了一个正则表达式,但我仍然需要让它工作。

于 2019-05-02T14:50:09.177 回答