我需要将下述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'
是否有任何工具或自动执行此操作?
答案 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,但我仍然需要使其正常工作。