1

我正在解决 Java 中的一个问题,需要制作一个正则表达式,它检查字符串中的下一个规则:

  1. 字符串必须只包含数字、大小写字母和下划线字符"_"
  2. 字符串不能从数字开始;
  3. 如果字符串以下划线开头,则第二个字符不能是下划线,即必须是数字或字母;
  4. 字符串只能由一个字符组成,但该字符不能是下划线;

我不明白如何制作正则表达式的第一部分。我试着把它一部分一部分:

  1. 表达式"_[a-zA-Z0-9]"满足条件“如果字符串从下划线字符开始,则第二个字符是字母或数字”。
  2. 表达式"\\D"满足条件“字符串不能从数字开始”。
  3. 表达式"[a-zA-Z]"满足条件“字符串以大写或小写字母开头”。

表达式的最后一部分很简单 - "w*"

当我尝试将所有这些放在一起"(_[a-zA-Z0-9])*|(\\D)*|([a-zA-Z])*w*"时,获得的正则表达式无法正常工作。

以下字符串b33_n1适合我的正则表达式,但字符串__适合它。

如何修复我的正则表达式?

4

2 回答 2

2

您可以使用

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

或者,使用简写:

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

查看正则表达式演示

细节

  • ^- 字符串开头(隐含在 中.matches()
  • (?![0-9]|__|_$)- 紧随其后,不能有数字或__子字符串,或_后跟字符串结尾
  • [a-zA-Z0-9_]+- 1+ ASCII 字母、数字或_*也用于匹配空字符串)
  • $- 字符串结尾(隐含在 中.matches())。

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

s.matches("(?!\\d|__|_$)\\w+")
于 2019-09-05T08:19:54.260 回答
1

@Wiktor 的答案是正确且紧凑的。不过,我想提供一个仅部分使用正则表达式的替代方案。我经常也在网上搜索一个紧凑的正则表达式并经常得到答案,但两个月后我不知道这个表达式是什么意思。

如果您不是像 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;
}
于 2019-09-05T09:17:15.417 回答