16

我想形成一个正则表达式 ro 识别一个变量名的声明。用户将输入一个他们想要的字符串作为变量名,程序必须检查变量是否有效。

  1. 变量名的第一个字符必须是字母或下划线。它不应该以数字开头。
  2. 变量名中不允许有逗号和空格。
  3. 变量名中不允许出现除下划线以外的特殊符号。

我一直在尝试一整天,但找不到正确的。

4

3 回答 3

43

我们要做的第一件事是收集第一个字符的所有有效字符的列表:

[a-zA-Z_$]

然后是其他字符:

[a-zA-Z_$0-9]

我们想要匹配整个字符串,并且我们可以有 0 个或更多其他字符,所以正则表达式变为:

^[a-zA-Z_$][a-zA-Z_$0-9]*$

我允许在正则表达式的第一个字符中使用大写字符(以及美元符号),因为这是对有效性的测试,而不是对格式良好的变量的测试。(请注意,常量全部大写,包括第一个字母。)

于 2013-07-10T06:49:47.137 回答
6

你可以使用这个:

"^[_a-z]\\w*$"

这个怎么运作:

^        // Match at the beginning
[_a-z]   // Match either "_", or "a-z" at the beginning 
\\w*     // Match zero or more of characters - [a-zA-Z0-9_], after the beginning
$        // Till the end

注意 - 根据Java 命名约定,变量不应大写字母开头,因此我没有将 - 包含[A-Z]在第一个字符类中。

此外,由于 Java 允许$在变量名中使用,即使在开始时,您也应该考虑将其添加到允许的字符集中。因此,您可以将上述正则表达式修改为:

"^[_$a-z][\\w$]*$"
于 2013-07-10T06:48:31.223 回答
3

这将做你想要的:

"^[a-z_]\\w*$"

解释:

  • ^: 从字符串的开头开始
  • [a-z_]: 匹配单个小写字母或下划线
  • \\w*:匹配零个或多个单词字符(\w相当于[a-zA-Z_0-9]
  • $: 匹配直到字符串的结尾。

编辑:更新以反映其他人指出的“允许使用美元符号”和“名称不应以大写字母开头”。感谢您的提醒。

编辑 2:在做了一些研究之后,我再次删除了美元符号的匹配。虽然在技术上是允许的,但在这种情况下肯定是不好的风格,因此不鼓励,就像以大写字母开头的变量一样。另请参阅https://stackoverflow.com/a/4636667/1814922

于 2013-07-10T06:56:36.437 回答