我想形成一个正则表达式,识别变量名称的声明。用户将输入他们想要的变量名字符串,程序必须检查变量是否有效。
我一整天都在努力,无法得到正确的答案。
答案 0 :(得分:26)
我们要做的第一件事是收集第一个字符的所有有效字符的列表:
[a-zA-Z_$]
然后是其他角色:
[a-zA-Z_$0-9]
我们希望匹配整个字符串,我们可以有0个或更多其他字符,因此正则表达式变为:
^[a-zA-Z_$][a-zA-Z_$0-9]*$
我允许正则表达式中第一个字符中的大写字符(以及美元符号),因为这是对有效性的测试,而不是对格式良好的变量的测试。 (请注意,常量应全部大写,包括第一个字母。)
答案 1 :(得分:3)
您可以使用:
"^[_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命名约定,变量应该不以大写字母开头,所以我没有包括 - {{ 1}}在第一个字符类中。
此外,由于Java允许在变量名中使用[A-Z]
,即使在开始时,也应考虑将其添加到允许的字符集中。因此,您可以将上述正则表达式修改为:
$
答案 2 :(得分:2)
这将做你想要的:
"^[a-z_]\\w*$"
说明:
^
:从字符串的开头[a-z_]
:匹配单个小写字母或下划线\\w*
:匹配零个或多个字词(\w
相当于[a-zA-Z_0-9]
)$
:匹配到字符串的结尾。编辑:已更新以反映其他人指出的“允许的美元符号”和“名称不应以大写字母开头”。谢谢你的提醒。
编辑2 :在做了一些研究后,我再次删除了美元符号的匹配。虽然在技术上是允许的,但在这种情况下它肯定是不好的风格,因此不鼓励,就像以大写字母开头的变量一样。另请参阅https://stackoverflow.com/a/4636667/1814922