我需要将不主张的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提供了正格,但我仍然需要使其正常工作。