我想形成一个正则表达式 ro 识别一个变量名的声明。用户将输入一个他们想要的字符串作为变量名,程序必须检查变量是否有效。
- 变量名的第一个字符必须是字母或下划线。它不应该以数字开头。
- 变量名中不允许有逗号和空格。
- 变量名中不允许出现除下划线以外的特殊符号。
我一直在尝试一整天,但找不到正确的。
我们要做的第一件事是收集第一个字符的所有有效字符的列表:
[a-zA-Z_$]
然后是其他字符:
[a-zA-Z_$0-9]
我们想要匹配整个字符串,并且我们可以有 0 个或更多其他字符,所以正则表达式变为:
^[a-zA-Z_$][a-zA-Z_$0-9]*$
我允许在正则表达式的第一个字符中使用大写字符(以及美元符号),因为这是对有效性的测试,而不是对格式良好的变量的测试。(请注意,常量应全部大写,包括第一个字母。)
你可以使用这个:
"^[_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$]*$"
这将做你想要的:
"^[a-z_]\\w*$"
解释:
^
: 从字符串的开头开始[a-z_]
: 匹配单个小写字母或下划线\\w*
:匹配零个或多个单词字符(\w
相当于[a-zA-Z_0-9]
)$
: 匹配直到字符串的结尾。编辑:更新以反映其他人指出的“允许使用美元符号”和“名称不应以大写字母开头”。感谢您的提醒。
编辑 2:在做了一些研究之后,我再次删除了美元符号的匹配。虽然在技术上是允许的,但在这种情况下肯定是不好的风格,因此不鼓励,就像以大写字母开头的变量一样。另请参阅https://stackoverflow.com/a/4636667/1814922