我正在解决Java中的一个问题,需要制作一个正则表达式,该正则表达式将检查字符串以查找下一条规则:
"_"
; 我不明白如何制作正则表达式的第一部分。我试图使其部分化:
"_[a-zA-Z0-9]"
满足以下条件:“如果字符串从下划线字符开始,则第二个字符是字母或数字”。"\\D"
满足条件“字符串不能从数字开头”。"[a-zA-Z]"
满足条件“字符串从大写或小写字母开始”。表达式的最后一部分很简单-"w*"
。
当我尝试将所有这些放在一起"(_[a-zA-Z0-9])*|(\\D)*|([a-zA-Z])*w*"
时,获得的regexp无法正常工作。
以下字符串b33
和_n1
不适合我的正则表达式,但字符串__
适合它。
如何修复我的正则表达式?
答案 0 :(得分:2)
您可以使用
^(?![0-9]|__|_$)[a-zA-Z0-9_]+$
或者,以简写方式:
^(?!\d|__|_$)\w+$
请参见regex demo
详细信息
^
-字符串的开头(在.matches()
中隐含)(?![0-9]|__|_$)
-之后,不能有数字或__
子字符串,或_
后跟字符串结尾[a-zA-Z0-9_]+
-1个以上的ASCII字母,数字或_
(也可以使用*
来匹配一个空字符串)$
-字符串的结尾(在.matches()
中隐含)。在Java中,将其与.matches()
一起使用,以省略锚点:
s.matches("(?!\\d|__|_$)\\w+")
答案 1 :(得分:1)
@Wiktor的回答是正确且紧凑的。但是,我想提供一种仅部分使用正则表达式的替代方法。我经常也在网上搜索紧凑的正则表达式,并经常得到答案,但是两个月后我不知道该表达式的含义。
如果您不是WiktorStribiżew这样的正则表达式天才,并且想一眼就看一下已验证的内容,建议您采用以下方法
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;
}