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

Tie*_*eme 1 regex validation cocoa-touch

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

用户名可能包含:

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

编辑:

对困惑感到抱歉

  • 我需要它用于可可触摸,但无论如何我必须将它翻译为服务器端的php.
  • 并且每次1个我的意思是空格或特殊字符应该用字母或数字分隔.

Li-*_*Yip 8

而不是编写一个大的正则表达式,编写单独的正则表达式来测试每个期望的条件会更清楚.

  • 测试用户名是否包含字母,数字,ASCII符号!通过@和空间:^(\p{L}|\p{N}|[!-@]| )+$.这必须匹配用户名才有效.请注意\p{L}Unicode字母的\p{N}类的使用和Unicode数字的类.

  • 测试用户名是否包含连续的空格:\s\s+.如果匹配,则用户名无效.

  • 测试符号是否连续出现:[!-@][!-@]+.如果匹配,则用户名无效.

这完全符合您的标准.

但是,根据用户名的编写方式,这种方法可能仍会拒绝完全有效的名称,如"Éponine".这是因为"É"可以写成U + 00C9 LATIN CAPITAL E WITH ACUTE(匹配\p{L})或类似的E后跟U + 02CA MODIFIER LETTER ACUTE ACCENT(匹配\p{L}).

Regular-Expressions.info说它更好:

同样,"字符"实际上意味着"Unicode代码点".\ p {L}匹配"字母"类别中的单个代码点.如果您的输入字符串是à编码为U + 0061 U + 0300,则它匹配没有重音的a.如果输入为à编码为U + 00E0,则它与重音符号相匹配.原因是代码点U + 0061(a)和U + 00E0(à)都在"字母"类别中,而U + 0300在"标记"类别中.

Unicode是多毛的,并且限制用户名中的字符无论如何都不一定是个好主意.你确定你要这么做吗?