如何编写允许重复的下划线的正则表达式

时间:2019-03-26 18:17:05

标签: regex flex-lexer

我正在做一项家庭作业,以使用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_

4 个答案:

答案 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:

  • Start with an alphanumeric value (^)
  • End with an alphanumeric value ($)
  • Optional underscore (_?)
  • Possibly multiple underscores, always followed by alphanumeric ()*

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_])+    $

Here is a demo

编辑:刚刚意识到,结尾也不能有下划线。通过先行,您可以将它们链接起来。

^[A-Z]    (?:    (?!__)    (?!_$)    [A-Z\d_]    )+$

在这里,我为双下划线添加了一个负前行,最后为下划线添加了一个负前行。

Here is a demo