Mryqu's Notes


  • 首页

  • 搜索
close

玩一道正则表达式练习题

时间: 2019-06-02   |   分类: Tech     |   阅读: 115 字 ~1分钟

前一段时间在网上碰到一道题,要求进行用户名检查:

  • 用户名长度要求最短6字符,最长16字符;
  • 用户名可以由字母、数字和可选的一个连字号(-)组成;
  • 用户名首字符必须为字母,末字符不可以是连字号。

这道题属于送分题,很容易写出下面的Java代码:

public class Username {
	public static int MIN_LEN = 6;
	public static int MAX_LEN = 16;
	
  public static boolean validate(String username) {
    if(username==null || 
       username.length()<MIN_LEN || 
       username.length()>MAX_LEN || 
      !Character.isLetter(username.charAt(0)))
      return false;
    int hyphenNum = 0;
        
    for(int i=1;i<username.length();i++) {
    	char ch = username.charAt(i);
    	
    	if (!Character.isLetterOrDigit(ch)) {
	    	if (ch=='-') {
	    		if(i== username.length()-1 || ++hyphenNum>1) return false;
	    	} else return false;
    	}
    }
    return true;    
  }
  
  public static void main(String[] args) {
    String[] tests = new String[] {
    	null,
        "mryqu123",
        "mryqu-123",
        "mryqu 123",
        "mryqu123-",
        "mryqu-123-bj",
        "123mryqu",
        "MryQu-123"
    };
    
    for(String test:tests) {
    	System.out.println(test+","+validate(test));
    }
  }
}

跟一老友聊天,老友觉得还是用正则表达式代码少,高大上。好吧,添一个方法即可:

  public static boolean validateByRegex(String username) {
    return username!=null && 
      username.matches("(?=^[A-Za-z].*$)(?!^.*\\-$)(?!^.*\\-.*\\-.*$)^[A-Za-z\\d\\-]{6,16}$");
  }

最后买一送一,送个JS版的:
code:username regex js validator

这个正则分四部分:

  1. 使用正向肯定预查匹配字母开始的用户名;
  2. 使用正向否定预查匹配非连字符结尾的用户名;
  3. 使用正向否定预查匹配最多含一个连字符的用户名;
  4. 匹配字母、数字和连字号组成的最短6字符、最长16字符的用户名。

标题:玩一道正则表达式练习题
作者:mryqu
声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!

#regex#
学习使用Minikube
使用Postman动态调试Salesforce API
  • 文章目录
  • 站点概览

Programmer & Architect

662 日志
27 分类
1472 标签
GitHub Twitter FB Page
© 2009 - 2023 Mryqu's Notes
Powered by - Hugo v0.120.4
Theme by - NexT
0%