Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 验证用户名的正则表达式_Java_Php_Html_Regex_Perl - Fatal编程技术网

Java 验证用户名的正则表达式

Java 验证用户名的正则表达式,java,php,html,regex,perl,Java,Php,Html,Regex,Perl,我正在尝试创建一个正则表达式,以根据以下条件验证用户名: 仅包含字母数字字符, 下划线和点 下划线和点不能在结尾或结尾 用户名的开头(例如\u用户名/用户名/.username/用户名。) 下划线和点不能相邻(例如user\uuu.name) 下划线或点不能在一行中多次使用(例如user\uu name/user..name) 字符数必须介于8到20之间 这就是我到目前为止所做的;听起来它强制执行所有的标准规则,但第五条规则除外。我不知道如何添加第五条规则: ^[a-zA-Z0-9]+([._

我正在尝试创建一个正则表达式,以根据以下条件验证用户名:

  • 仅包含字母数字字符, 下划线和点
  • 下划线和点不能在结尾或结尾 用户名的开头(例如
    \u用户名
    /
    用户名
    /
    .username
    /
    用户名。
  • 下划线和点不能相邻(例如
    user\uuu.name
  • 下划线或点不能在一行中多次使用(例如
    user\uu name
    /
    user..name
  • 字符数必须介于8到20之间
  • 这就是我到目前为止所做的;听起来它强制执行所有的标准规则,但第五条规则除外。我不知道如何添加第五条规则:

     ^[a-zA-Z0-9]+([._]?[a-zA-Z0-9]+)*$
    

    我想你必须在这里使用先行表达式

    试一试

    ^[a-zA-Z0-9](?!(?)(?!(?)))[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$

    [a-zA-Z0-9]
    一个字母数字(

    \u(?!\)
    a后面不跟.或

    \.(?!\)
    a.后面不跟a或

    [a-zA-Z0-9]
    用于

    {6,18}
    最少6到最多18次

    [a-zA-Z0-9]
    字母数字


    (第一个字符是alphanum,然后是6到18个字符,最后一个字符是alphanum,6+2=8,18+2=20)

    对不起,我从自己的库中生成了这个,它使用了对Dart/Javascript/Java/Python有效的语法,但不管怎样,下面是:

    (?:^)(?:(?:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKlMNOPQRSTUVWXYZ0123456789]){1,1})(?!(?:(?:(?:(?:_\.){1,1}))|(?:(?:(?:__){1,1}))|(?:(?:(?:\.\.){1,1}))))(?:(?:(?:(?:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKlMNOPQRSTUVWXYZ0123456789._]){1,1})(?!(?:(?:(?:(?:_\.){1,1}))|(?:(?:(?:__){1,1}))|(?:(?:(?:\.\.){1,1}))))){6,18})(?:(?:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKlMNOPQRSTUVWXYZ0123456789]){1,1})(?:$)
    
    我的库代码:

    var alphaNumeric = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "l", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
    var allValidCharacters = new List.from(alphaNumeric);
    allValidCharacters.addAll([".", "_"]);
    
    var invalidSequence = (r) => r
      .eitherString("_.")
      .orString("__")
      .orString("..");
    
    var regex = new RegExpBuilder()
      .start()
      .exactly(1).from(alphaNumeric).notBehind(invalidSequence)
      .min(6).max(18).like((r) => r.exactly(1).from(allValidCharacters).notBehind(invalidSequence))
      .exactly(1).from(alphaNumeric)
      .end()
      .getRegExp();
    

    我的图书馆:

    对Phillip的答案稍作修改,即可满足最新要求

    ^[a-zA-Z0-9]([._](?![._])|[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$
    

    这一个应该做到:

    if(Regex.IsMatch(text,@)
    #使用5个约束验证用户名。
    ^#锚定至管柱起点。
    #1-仅包含字母数字字符、下划线和点。
    #2-下划线和点不能位于用户名的结尾或开头,
    #3-下划线和点不能相邻。
    #4-每次只有一个下划线或点有效。
    (?=[A-Za-z0-9]+(?:[.][A-Za-z0-9]+)*$)
    #5-字符数必须介于8到20之间。
    [A-Za-z0-9.]{8,20}应用约束5。
    $#锚定到字符串末端。
    “,RegexOptions.ignorepattern(空格))
    {
    //成功的比赛
    }否则{
    //匹配尝试失败
    } 
    
    尽管我非常喜欢正则表达式,但我认为可读性是有限的

    所以我建议

    new Regex("^[a-z._]+$", RegexOptions.IgnoreCase).IsMatch(username) &&
    !username.StartsWith(".") &&
    !username.StartsWith("_") &&
    !username.EndsWith(".") &&
    !username.EndsWith("_") &&
    !username.Contains("..") &&
    !username.Contains("__") &&
    !username.Contains("._") &&
    !username.Contains("_.");
    
    它更长,但不需要维护人员打开expresso来理解

    当然你可以注释一个长正则表达式,但是谁读过它就必须依赖于信任$

    ^(?=.{8,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$
     └─────┬────┘└───┬──┘└─────┬─────┘└─────┬─────┘ └───┬───┘
           │         │         │            │           no _ or . at the end
           │         │         │            │
           │         │         │            allowed characters
           │         │         │
           │         │         no __ or _. or ._ or .. inside
           │         │
           │         no _ or . at the beginning
           │
           username is 8-20 characters long
    
    ^#线路起点

    private static final Scanner scan = new Scanner(System.in);
    
    public static void main(String[] args) {
        int n = Integer.parseInt(scan.nextLine());
        while (n-- != 0) {
            String userName = scan.nextLine();
            String regularExpression = "^[[A-Z]|[a-z]][[A-Z]|[a-z]|\\d|[_]]{7,29}$";
            if (userName.matches(regularExpression)) {
                System.out.println("Valid");
            } else {
                System.out.println("Invalid");
            }
        }
    }
    
    [a-z0-9_-]#匹配列表中的字符和符号,a-z,0-9,下划线,连字符

    {3,15}#长度至少为3个字符,最大长度为15

    $#线路的尽头

    private static final Scanner scan = new Scanner(System.in);
    
    public static void main(String[] args) {
        int n = Integer.parseInt(scan.nextLine());
        while (n-- != 0) {
            String userName = scan.nextLine();
            String regularExpression = "^[[A-Z]|[a-z]][[A-Z]|[a-z]|\\d|[_]]{7,29}$";
            if (userName.matches(regularExpression)) {
                System.out.println("Valid");
            } else {
                System.out.println("Invalid");
            }
        }
    }
    

    您可以测试正则表达式

    否,每次只允许出现一次下划线或点,但a_b_c_d_e将是有效的,对吗?是的,它是有效的。我现在正在测试你的正则表达式,听起来很好:)如果用非点分隔,可以有多个点吗?i、 e.
    “A.B.C”
    (下划线的问题相同?)是的,这很搞笑:)我可能只需要做一个简单的正则表达式,然后使用contains、startsWith等。。。无论如何好的,将修复编号。请尝试:
    ^[a-zA-Z0-9](?!(\。但是
    (\u124;\)
    表达式可以简化为
    [\u124;]
    。很好,如果有人需要这样一个用于JS的正则表达式,这就是方法。它在所有浏览器中都能工作,不像最受欢迎的答案是Chrome-only@ridgerunner-我相信这样很容易阅读和移植到代码。@vigneshkumar-同样的意思,但是
    [a-zA-Z0-9.\u]
    很容易阅读和理解
    @JacksonLenhart-您使用的是什么正则表达式引擎和编程语言?请注意,这个问题被标记为
    asp.net
    标记,虽然答案对大多数其他语言和引擎都有效,但并非所有问题都支持负的前向和后向零长度断言。请注意,此正则表达式会导致Angular应用程序在IOS设备上崩溃,以及在Firefox浏览器上。这允许在开头和结尾使用下划线,这是不需要的。它还匹配只包含下划线的无限长字符串。@Toto,我修复了它。这给字符限制规则带来了问题,给定的规则是
    {6,18}
    它接受最少8个字符,而它必须接受6个字符,如果我将它设置为
    {4,18}
    ,那么它将接受6个字符,而我已经定义了4个字符
    ^(?=.{4,20}$)(?:[a-zA-Z\d]+(?:(?:\.|-|_)[a-zA-Z\d])*)+$
    
    function isUserName(val){
        let regUser=/^[a-zA-Z0-9](_(?!(\.|_))|\.(?!(_|\.))|[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$/;
        if(!regUser.test(val)){
          return 'Name can only use letters,numbers, minimum length is 8 characters';
        }
      }