我正在做一项家庭作业,以使用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_
答案 0 :(得分:3)
在您的[A-Za-z]([A-Za-z0-9][_]?[A-Za-z0-9])*
中,第一个[A-Za-z0-9]
可以/必须省略(例如,考虑单个字母标识符),从而导致[A-Za-z]([_]?[A-Za-z0-9])*
。这似乎正是要问的问题,并且是研究在正则表达式下重复组合可选元素的效果的好练习。
答案 1 :(得分:1)
要扩展正则表达式以选择性地一次将太短的下划线夹在字符串中,可以使用此正则表达式。
[A-Za-z][A-Za-z0-9]*(_[A-Za-z0-9]+)*
我刚刚添加了(_[A-Za-z0-9]+)*
部分,该部分允许单个下划线,然后至少一个字母数字字符全部为零或多次,以仅使下划线保持可选。
现在,您将不得不处理其他方面,因为我对flex并不熟悉。
答案 2 :(得分:0)
To do what you want you have to keep a few things in mind:
^
)$
)_?
)()*
Example:
^[A-Za-z]+(_?[A-Za-z0-9]+)*$
Test here: https://regex101.com/r/RORy6P/5
如果需要,您可以抛锚。
答案 3 :(得分:-1)
首先,从这个开始:
^ [A-Z][A-Z\d_]+ $
现在,我们要说的是,我们需要确保字符串中不出现两个连续的下划线。通常,我们要做的是将其包括在负前瞻中,例如:
(?:(?!__).)+
当我们将其插入表达式中时,最终会得到如下所示,它允许任何字符,只要它不是换行符或双下划线:
^ [A-Z] (?:(?!__).)+ $
因此,我们可以用开头定义的字符类替换点:
^ [A-Z] (?:(?!__)[A-Z\d_])+ $
编辑:刚刚意识到,结尾也不能有下划线。通过先行,您可以将它们链接起来。
^[A-Z] (?: (?!__) (?!_$) [A-Z\d_] )+$
在这里,我为双下划线添加了一个负前行,最后为下划线添加了一个负前行。