Java 字符串必须仅包含[a-zA-Z0-9]符号(可以是一个字母,但不能是“uquot;”),不能从数字开始
我正在用Java解决一个问题,需要生成一个regexp,用于检查字符串中的下一个规则:Java 字符串必须仅包含[a-zA-Z0-9]符号(可以是一个字母,但不能是“uquot;”),不能从数字开始,java,regex,Java,Regex,我正在用Java解决一个问题,需要生成一个regexp,用于检查字符串中的下一个规则: 字符串必须只包含数字、大小写字母和下划线字符 字符串不能从数字开始 如果字符串以下划线开头,则第二个字符不能是下划线,即它必须是数字或字母 字符串只能由一个字符组成,但该字符不能是下划线 我不明白如何制作regexp的第一部分。我试着一部分一部分地做: 表达式“[a-zA-Z0-9]”满足条件“如果字符串以下划线字符开头,则第二个字符为字母或数字” 表达式“\\D”满足条件“字符串不能从数字开始” 表达式“[
“\\D”
满足条件“字符串不能从数字开始”“[a-zA-Z]”
满足“字符串从大写或小写字母开始”的条件“w*”
当我试图将所有这些放在一起时,“([a-zA-Z0-9])*(\\D)*|([a-zA-Z])*w*”
,得到的regexp无法正常工作
以下字符串b33
和\u n1
不适合我的regexp,但字符串\u
适合它
如何修复我的regexp?您可以使用
^(?![0-9]|__|_$)[a-zA-Z0-9_]+$
或者,用速记:
^(?!\d|__|_$)\w+$
见
详细信息
-字符串的开头(隐式在^
中).matches()
-后面不能有数字或(?![0-9]| | | | | | | u$)
子字符串,或|
后跟字符串结尾|
-1+ASCII字母、数字或[a-zA-Z0-9+
(也可使用
匹配空字符串)*
-字符串结尾(隐式在$
中).matches()
.matches()
一起使用,忽略锚定:
s.matches("(?!\\d|__|_$)\\w+")
@Wiktor给出的答案正确且简洁。尽管如此,我还是想提供一个仅部分使用regex的替代方案。我经常在网上搜索一个紧凑的正则表达式,经常得到答案,但两个月后我不知道这个表达式的意思 如果你不是像Wiktor Stribiżew这样的regex天才,并且希望第一眼看到什么是经过验证的,我建议你采用以下方法
static boolean check(String s){
if(s.matches("[a-zA-Z0-9_]+")){
if( !Character.isDigit(s.charAt(0))){
if(!s.startsWith("__")){
return !(s.length() == 1 && s.equals("_"));
}
}
}
return false;
}
请注意,
w
只匹配w
字符,而不是单词字符,您应该使用\w
。但是,\D*
将匹配所有非数字的字符串,([a-zA-Z0-9])*
匹配像\u a\u 1\u b\u 4\u t这样的字符串<代码>([a-zA-Z])*w*
将匹配任何纯字母字符串。正如您所看到的,这是一个相当腐败的模式。谢谢您,我理解使用您的解决方案时出现错误的地方。我使用了以下正则表达式:([a-zA-Z\\d]|[a-zA-Z]\\w*)\\w*
。