首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ABNF规则转换为正则表达式

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

Stack Overflow用户
提问于 2013-11-27 12:25:48
回答 2查看 1.1K关注 0票数 2

请帮我理解一下这个ABNF规则([a-z]* [A-Z]* [0-9]*)*

我认为可以像这样将它转换为正则表达式[a-zA-Z0-9]*。因此,ABNF规则应匹配任意顺序的小写和/或大写字母和/或数字及其组合。例如,下面的字符串应该与规则匹配。

代码语言:javascript
复制
"ABC", "abc", "abc12", "aAbC876", "123go", etc.

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

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

EN

回答 2

Stack Overflow用户

发布于 2013-11-27 13:49:39

Internet规范通常需要定义格式语法。增强的巴科斯-诺尔形式(ABNF)是Backus-Naur Form (通常用于描述计算中使用的语言的语法)的修改版本,并且在许多用于平衡紧凑性和简单性的规范中很流行。

BNF在标准的BNF中有一组特定的核心规则。

你的规则:

代码语言:javascript
复制
([a-z]* [A-Z]* [0-9]*)*

解释为ABNF规则:

代码语言:javascript
复制
(  )        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)

你的规则转换成一个扩展的正则表达式几乎是一样的。

代码语言:javascript
复制
([a-z]*[A-Z]*[0-9]*)*

解释:

代码语言:javascript
复制
(           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规则类似于基本的正则表达式,都涉及命名规则、重复、替代、顺序无关性和范围。

票数 2
EN

Stack Overflow用户

发布于 2013-11-27 13:22:51

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

代码语言:javascript
复制
([a-z]* [A-Z]* [0-9]*)*

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

代码语言:javascript
复制
([a-z]*[A-Z]*[0-9]*)*

两者的意思都是“零个或多个重复的小写字母:一个由零个或多个小写字母组成的序列,然后是零个或多个大写字母,最后是零个或多个数字”。

由于这些术语的性质,您可以将其简化为(在本例中,但通常需要注意):

代码语言:javascript
复制
[a-zA-Z0-9]*

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20233894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档