我正在寻找一个正则表达式来验证用户名。
用户名可能包含:
"!@#$%^&*.:;<>?/\|{}[]_+=-"
),但一次只有1个编辑:
对不起有困惑
答案 0 :(得分:6)
不是编写一个大的正则表达式,而是编写单独的正则表达式来测试每个所需的条件会更清楚。
测试用户名是否仅包含字母,数字,ASCII符号!
到@
和空格:^(\p{L}|\p{N}|[!-@]| )+$
。这必须匹配用户名才有效。请注意,对于Unicode字母使用\p{L}
类,对Unicode编号使用\p{N}
类。
测试用户名是否包含连续的空格:\s\s+
。如果匹配,则用户名无效。
测试符号是否连续出现:[!-@][!-@]+
。如果匹配,则用户名无效。
这完全符合你的标准。
但是,根据用户名的编写方式,这种方法可能仍会拒绝完全有效的名称,如“Éponine”。这是因为“É”可以写成U + 00C9 LATIN CAPITAL E WITH ACUTE(由\p{L}
匹配)或类似E
后跟U + 02CA MODIFIER LETTER ACUTE ACCENT(其中 与\p{L}
匹配。)
Regular-Expressions.info says it better:
同样,“character”实际上意味着“Unicode代码点”。 \ p {L}匹配a “字母”类别中的单个代码点。如果您的输入字符串是à 编码为U + 0061 U + 0300,它匹配没有重音的a。如果 输入为à编码为U + 00E0,它与重音符号相匹配。原因 是代码点U + 0061(a)和U + 00E0(à)都在 类别“字母”,而U + 0300属于“标记”类别。
Unicode是多毛的,并且限制用户名中的字符无论如何都不一定是个好主意。你确定要这么做吗?
答案 1 :(得分:1)
表达式
^(\w| (?! )|["!@#$%^&*.:;<>?/\|{}\[\]_+=\-")](?!["!@#$%^&*.:;<>?/\|{}\[\]_+=\-")]))*$
如果你的方言支持先行断言,将主要做你想要的。 请参阅RegExr中的实际操作。
请问问自己为什么要以这种方式限制用户名。大多数时候用户名以“!!”开头应该不是问题,如果你拒绝他们想要的用户名,你会惹恼用户。
修改: \w
与非拉丁字符不匹配。要执行此操作,请将\w
替换为\p{L}
可能,或者可能不起作用,具体取决于您的正则表达式实现。不幸的是,Regexr不支持它。
答案 2 :(得分:1)
答案 3 :(得分:0)
你想要像
这样的东西string strUserName = "BillYBob Stev#nS0&";
Regex regex = new Regex(@"(?i)\b(\w+\p{P}*\p{S}*\p{Z}*\p{C}*\s?)+\b");
Match match = regex.Match(strUserName);
如果您想要解释,请告诉我。
我希望这会有所帮助。
注意:这不区分大小写。
答案 4 :(得分:0)
由于我不知道您需要这种解决方案的语言,我提供的是Java解答。它可以在任何其他平台上翻译:
String str = "à123 àà@bcà#";
String regex = "^([\\p{L}\\d]+[!@#$%\\^&\\*.:;<>\\?/\\|{}\\[\\]_\\+=\\s-]?)+$";
Pattern p = Pattern.compile(regex);
matcher = p.matcher(str);
if (matcher.find())
System.out.println("Matched: " + matcher.group());
我做的一个假设是用户名将以unicode字母或数字开头。