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

时间:2012-04-24 13:23:56

标签: regex cocoa-touch validation

我正在寻找一个正则表达式来验证用户名。

用户名可能包含:

  • 信件(西方,希腊,俄罗斯等)
  • 数字
  • 空格,但一次只有1个
  • 特殊字符(例如:"!@#$%^&*.:;<>?/\|{}[]_+=-"),但一次只有1个

编辑:

对不起有困惑

  • 我需要它用于可可触摸,但无论如何我必须将它翻译为服务器端的php。
  • 我一次用1表示空格或特殊字符应用字母或数字分隔。

5 个答案:

答案 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)

试试这个:

^[!@#$%^&*.:;<>?\/\|{}\[\]_+= -]?([\p{L}\d]+[!@#$%^&*.:;<>?/\|{}\[\]_+= -]?)+$

rubular

答案 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字母或数字开头。