使用正则表达式表示标识符

26

C语言中识别标识符的常规定义如下:

letter -> a|b|...z|A|B|...|Z|_
digit -> 0|1|...|9
identifier -> letter(letter|digit)*

这个定义将生成以下形式的标识符

标识符:[_a-zA-Z][_a-zA-Z0-9]*

我现在的问题是如何限制生成的标识符长度不超过31个字符。需要对正则表达式定义进行哪些更改或如何编写正则表达式来限制长度不超过指定长度。请问是否有人可以帮忙。谢谢。


顺便提一下,原始的正则表达式可以通过使用负向先行断言和预定义字符类(?!\d)\w*来缩短。 - darw
2个回答

38

你要寻找的正则表达式是:

[_a-zA-Z][_a-zA-Z0-9]{0,30}

它将匹配一个跟随着 X 个下划线、字母或数字的下划线字母,其中 0 <= X <= 30


当另外两个用户提出建议时,我立刻明白了...不管怎样,还是谢谢。 - Jeris
@jerisalan 好的。我只是提出我的问题,因为你在两个答案中都问了“是否有可能改变常规定义以带来相同的变化”。 - Oscar Mederos
1
这里的 {0,30} 仅限于 [_a-zA-Z0-9] 的长度。上述正则表达式意味着从 [_a-zA-Z] 中选取1个字符,从 [_a-zA-Z0-9] 中最多选取30个字符。 - Ojasv singh

0

更新:更新正则表达式,使标识符不以数字开头。

为了限制长度,通常使用{}
例如,您的正则表达式是[_a-zA-Z0-9]+。这意味着允许任何字母数字值和下划线,并且长度必须大于等于1。如果我们想将其限制在不超过31个字符,则可以将正则表达式重写为:

[_a-zA-Z0-9]{1,31}

{1,31} 表示接受长度大于等于1且小于等于31的字母数字值。

然而,上述正则表达式也意味着标识符可以以数字开头。请注意,提供了三个范围:a-z,A-Z和0-9。为了将标识符限制为以字母或下划线开头,后跟字母、数字或下划线的正则表达式如下所示:

[_a-zA-Z][_a-zA-Z0-9]{0,30}

正则表达式的第一部分[_a-zA-Z]强制标识符以字符或下划线开头。它还确保标识符不为空。正则表达式的其余部分[_a-zA-Z0-9]{0-30}确保只接受字符、下划线和数字,并且除了第一个字符外,最多可以添加30个字符到标识符中。

您可以对您的正则表达式进行相应的更改。


谢谢...有没有可能改变常规定义以实现相同的更改。 - Jeris
5
标识符不得以数字开头,可以包含下划线(_)。 - vlad_tepesch
我同意。我已经对答案进行了相应的更改。 - Ali Shah Ahmed
[a-zA-Z][a-zA-Z0-9]{0-30} you forgot about _(Underline) and that must be [a-zA-Z_][a-zA-Z0-9_]{0-30} - Mamrezo
{0-30} should be {0, 30} - Amin Ya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接