为了账号安全,请及时绑定邮箱和手机立即绑定

字符串只能包含 [a-zA-Z0-9_] 符号(可以来自一个字母,但不能是“_”),不能从数字开始

字符串只能包含 [a-zA-Z0-9_] 符号(可以来自一个字母,但不能是“_”),不能从数字开始

隔江千里 2023-07-13 13:59:58
我正在解决 Java 中的一个问题,需要创建一个正则表达式,它检查字符串中的下一个规则:字符串只能包含数字、大小写字母和下划线字符"_";字符串不能以数字开头;如果字符串以下划线开头,则第二个字符不能是下划线,即必须是数字或字母;该字符串只能由一个字符组成,但该字符不能是下划线;我不明白如何制作正则表达式的第一部分。我尝试将其部分部分地制作:表达式"_[a-zA-Z0-9]"满足条件“如果字符串以下划线字符开头,则第二个字符是字母或数字”。表达式"\\D"满足条件“字符串不得以数字开头”。表达式"[a-zA-Z]"满足条件“字符串以大写或小写字母开头”。表达式的最后一部分很简单—— "w*"。当我尝试将所有这些放在一起时"(_[a-zA-Z0-9])*|(\\D)*|([a-zA-Z])*w*",获得的正则表达式无法正常工作。以下字符串b33不_n1适合我的正则表达式,但该字符串__适合它。如何修复我的正则表达式?
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

您可以使用

^(?![0-9]|__|_$)[a-zA-Z0-9_]+$

或者,用简写:

^(?!\d|__|_$)\w+$

请参阅正则表达式演示

细节

  • ^- 字符串的开头(隐含在.matches()

  • (?![0-9]|__|_$)- 之后不能有数字或__子字符串,或者_后面不能有字符串结尾

  • [a-zA-Z0-9_]+- 1+ ASCII 字母、数字或_*也用于匹配空字符串)

  • $- 字符串结尾(隐含在 中.matches())。

在 Java 中,使用它时.matches()省略锚点:

s.matches("(?!\\d|__|_$)\\w+")


查看完整回答
反对 回复 2023-07-13
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

尽管如此,我想提供一种仅部分使用正则表达式的替代方案。我经常也在网上搜索紧凑的正则表达式,并经常得到答案,但两个月后我不知道该表达式的含义。


如果您不是像 Wiktor Stribiż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;

}


查看完整回答
反对 回复 2023-07-13
  • 2 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信