正则表达式允许特定的特殊字符

3

我目前正在验证用户名输入,并且必须验证某些特殊字符是否允许插入输入。

白名单中的字符为:

$#+{}:?.,~@"和空格

黑名单中的字符为:

^$;\-()<>|='%_

验证应该允许任何字母数字字符与一个或多个特殊字符和空格。它也可以处理黑名单情况,两种方式都可以。

我有这个:

public static boolean alphNum(String value) {
    Pattern p = Pattern.compile("^[\\w ]*[^\\W_][\\w ]*$");
    Matcher m = p.matcher(value);
    return m.matches();
}

原本只允许字母数字和空格,但现在需要允许特定列表中的特殊字符。

以下是需要允许的一些示例:

  • Name1$
  • Name1# Name2
  • Name1 Name2
  • Name Name2
  • Name1 Name...

我看过很多正则表达式验证,但没有这么具体的,如果有人能帮我解决这个问题,我会非常感激。


那么,必须至少有一个特殊字符,包括空格吗? - Fred Porciúncula
2
你的白名单和黑名单中都有 $ 吗? - Shar1er80
1
那么对于不在任何列表中的字符呢? - hair raisin
@ThiagoPorciúncula 没有必要至少有一个特殊字符或空格。 - gusadolfo
@Shar1er80 这是一个打字错误,抱歉,应该允许使用 $ 符号。 - gusadolfo
显示剩余2条评论
3个回答

3

如果没有限制,比如“必须以字母开头”或“必须包含至少一个字母”(您的问题没有具体说明),并且假设您所说的“空格”只是指空格,而不是制表符、换行符等,则表达式应该为:

Pattern.compile("^[\\$#\\+{}:\\?\\.,~@\"a-zA-Z0-9 ]+$");

请注意,这个正则表达式允许只有一个空格,或者用户名与其他用户相同,除了尾随空格的数量等。如果你想更加严格并强制要求以字母或数字开头(例如),可以使用以下内容:
Pattern.compile("^[a-zA-Z0-9][\\$#\\+{}:\\?\\.,~@\"a-zA-Z0-9 ]+$");

是的,它必须至少有1个字母数字字符,特殊字符不是必须的,并且无法规定它应该在字母数字或特殊字符的开头或结尾。 - gusadolfo
你真正验证了两个条件:1)必须至少有一个字母数字字符,2)所有字符都必须是白名单中的字符。虽然可以在单个正则表达式中完成此操作,但出于自己的理智考虑,我倾向于为每个条件使用单独的表达式。因此,第一个正则表达式检查第二个条件,第一个条件可以使用Pattern.compile("[0-9a-zA-Z]").matcher(value).matches()进行检查。 - hair raisin

1
使用此模式,允许使用未列入黑名单字符。
"[^^;\\-()<>|='%_]+"

第一个^表示以下任何字符。在你确定$是好字符还是坏字符之前,我将其视为好字符。
代码示例:
public static void main(String[] args) throws Exception {
    List<String> userNames = new ArrayList() {{
        add("Name1$");          // Good
        add("Name1# Name2");    // Good
        add("Name1 Name2");     // Good
        add("Name Name2");      // Good
        add("Name1 Name");      // Good
        add("UserName$");       // Good
        add("UserName^");       // Bad
        add("UserName;");       // Bad
        add("User-Name");       // Bad
        add("User_Name");       // Bad
    }};
    Pattern pattern = Pattern.compile("[^^;\\-()<>|='%_]+");

    for (String userName : userNames) {
        if (pattern.matcher(userName).matches()) {
            System.out.println("Good Username");
        } else {
            System.out.println("Bad Username");
        }
    }
}

结果:

Good Username
Good Username
Good Username
Good Username
Good Username
Good Username
Bad Username
Bad Username
Bad Username
Bad Username

0
public class Patteren {
       private static final Pattern specialChars_File = Pattern.compile("[a-zA-Z0-9-/.,:+\\s]*");

     //CASE-1 : Allow only charaters specifed, here im aloowiing ~ '
      private static final Pattern specialCharsRegex_Name = Pattern.compile("[a-zA-Z0-9~']*");

      //.CASE-2: Dont Allow specifed charaters, here im not aloowiing < >
      private static final Pattern specialCharRegex_Script = Pattern.compile("[<>]");

 public static void main(String[] args) {

     if (!specialCharsRegex_Name.matcher("Satya~").matches()) {
       System.out.println("InValid....Error message here ");
     }

     if (specialCharRegex_Script.matcher("a").find()) {
       System.out.println("SCript Tag ... Error Message");
     }
   }
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接