Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串必须仅包含[a-zA-Z0-9]符号(可以是一个字母,但不能是“uquot;”),不能从数字开始_Java_Regex - Fatal编程技术网

Java 字符串必须仅包含[a-zA-Z0-9]符号(可以是一个字母,但不能是“uquot;”),不能从数字开始

Java 字符串必须仅包含[a-zA-Z0-9]符号(可以是一个字母,但不能是“uquot;”),不能从数字开始,java,regex,Java,Regex,我正在用Java解决一个问题,需要生成一个regexp,用于检查字符串中的下一个规则: 字符串必须只包含数字、大小写字母和下划线字符 字符串不能从数字开始 如果字符串以下划线开头,则第二个字符不能是下划线,即它必须是数字或字母 字符串只能由一个字符组成,但该字符不能是下划线 我不明白如何制作regexp的第一部分。我试着一部分一部分地做: 表达式“[a-zA-Z0-9]”满足条件“如果字符串以下划线字符开头,则第二个字符为字母或数字” 表达式“\\D”满足条件“字符串不能从数字开始” 表达式“[

我正在用Java解决一个问题,需要生成一个regexp,用于检查字符串中的下一个规则:

  • 字符串必须只包含数字、大小写字母和下划线字符
  • 字符串不能从数字开始
  • 如果字符串以下划线开头,则第二个字符不能是下划线,即它必须是数字或字母
  • 字符串只能由一个字符组成,但该字符不能是下划线 我不明白如何制作regexp的第一部分。我试着一部分一部分地做:

  • 表达式“[a-zA-Z0-9]”满足条件“如果字符串以下划线字符开头,则第二个字符为字母或数字”
  • 表达式
    “\\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$)
      -后面不能有数字或
      |
      子字符串,或
      |
      后跟字符串结尾
    • [a-zA-Z0-9+
      -1+ASCII字母、数字或
      (也可使用
      *
      匹配空字符串)
    • $
      -字符串结尾(隐式在
      .matches()
      中)
    在Java中,将其与
    .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*