将ABNF规则转换为正则表达式

时间:2013-11-27 04:25:48

标签: regex abnf

请帮助我理解ABNF规则([a-z]* [A-Z]* [0-9]*)* 我认为它可以像[a-zA-Z0-9]*一样转换为正则表达式。因此,ABNF规则应该以任何顺序及其组合匹配小写和/或大写字母和/或数字。例如,下面的字符串应与规则匹配。

"ABC", "abc", "abc12", "aAbC876", "123go", etc.

如果ABNF规则是([a-z]* [A-Z]* | [0-9]*)*,它也可以转换为相同的正则表达式。

验证正则表达式很简单,但有没有工具或某些东西可以验证我对这些ABNF规则的理解,还是有人可以确认或纠正我吗?

2 个答案:

答案 0 :(得分:2)

Internet规范通常需要定义格式语法。 增强的Backus-Naur表单 ABNF )是Backus-Naur Form的修改版本(通常用于描述计算中使用的语言的语法)并且在许多这些规范中很受欢迎,用于平衡紧凑性和简单性。

ABNF 在标准 BNF 中有一套核心规则。

你的规则:

([a-z]* [A-Z]* [0-9]*)*

解释为 ABNF 规则:

(  )        Elements enclosed in parentheses are treated as a 
            single element whose contents are strictly ordered.  
[  ]        Square brackets enclose an optional element sequence
a-z A-Z     Core rule for a ALPHA character
0-9         Core rule for a DIGIT character
*           Repeat (Repetition rule)

你的规则被翻译成扩展的正则表达式几乎是相同的。

([a-z]*[A-Z]*[0-9]*)*

说明:

(           group and capture to \1 (0 or more times)
 [a-z]*     any character of: 'a' to 'z' (0 or more times)
 [A-Z]*     any character of: 'A' to 'Z' (0 or more times)
 [0-9]*     any character of: '0' to '9' (0 or more times)
)*          end of \1 

ABNF规则与基本正则表达式类似,都涉及命名规则,重复,备选方案,顺序独立性和范围。

答案 1 :(得分:1)

您引用的ABNF规则的直接翻译:

([a-z]* [A-Z]* [0-9]*)*

将是这样的ERE(扩展正则表达式),它省略了空格:

([a-z]*[A-Z]*[0-9]*)*

两者都表示零次或多次重复:零个或多个小写字母的序列,后跟零个或多个大写字母,后跟零个或多个数字'。

由于条款的性质,您可以简化(在这种情况下,但通常需要小心):

[a-zA-Z0-9]*

您的替代ABNF规则也可以转换为相同的ERE,但这仅仅是因为此特定情况的性质 - 翻译不会自动生效。

我假设示例输出中的双引号和逗号不是应该匹配的字符串的一部分。