首页 > 解决方案 > 如何编写允许不重复下划线的正则表达式

问题描述

我正在做一项家庭作业,以使用 Flex 创建词法分析器。我必须满足的最后一个要求是:

应修改标识符的定义,以便可以包含下划线,但是,不允许使用连续的下划线、前导和尾随下划线。

给定的正则表达式是[A-Za-z][A-Za-z0-9]*. 让它识别下划线很容易,我只是将它添加到第二组中,例如[A-Za-z][A-Za-z0-9_]*. 照原样,正则表达式不匹配任何带有前导下划线的字符串。

在进行尽职调查以确保我没有发布不需要的内容时,我创建了这个似乎有效的正则表达式[A-Za-z]([A-Za-z0-9][_]?[A-Za-z0-9])*。这会在开头查找一个字母,然后是一个重复的模式或字母数字字符、可能的下划线和字母数字字符。虽然这可行,但我认为这不是预期的,并希望就任何更好的方法获得一些建议

我一直在使用以下字符串(由讲师提供)进行测试:

name_1
name__2
_name3
name4_

标签: regexflex-lexer

解决方案


在您[A-Za-z]([A-Za-z0-9][_]?[A-Za-z0-9])*的第一个[A-Za-z0-9]可以/必须省略(考虑例如单字母标识符),导致[A-Za-z]([_]?[A-Za-z0-9])*. 这似乎正是所要求的,并且似乎是研究在正则表达式中重复组合可选元素的效果的一个很好的练习。


推荐阅读