这个正则表达式可以改进吗?

时间:2011-03-09 19:18:12

标签: regex c#-3.0

我有一个正则表达式来匹配用户输入的id,其基本格式为[a-zA-z]{2}[\d]{8}但是踢球者是一个空格,可以放在id中的任何字母或数字之间,所以我的正则表达式看起来像这样< / p>

[A-Za-z]+[\s]*[A-Za-z]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*

这显然是一种憎恶,应该用火杀死,这可以改善吗?

以下所有内容均为有效输入

a b 1 2 2 3 4 5 5 6
ab12345678
ab 12345678

4 个答案:

答案 0 :(得分:2)

您的正则表达式不符合您的规范,数字前可以有2个或更多字母吗?超过8位数或8位数或更多?

尝试

([a-zA-Z]\s*){2}(\d\s*){8}

如果每个角色之间只能有一个空格:

([a-zA-Z]\s?){2}(\d\s?){8}

答案 1 :(得分:2)

请不要使用\d\s,除非您确切知道要去哪里......

\d将匹配09E6 0 BENGALI DIGIT ZERO(0是你的数字:-))。例如,阅读http://msdn.microsoft.com/en-us/library/w1c0s6bb.aspx

\s将匹配更多类型的奇怪空格(和制表符),而不是开玩笑。我不是在开玩笑。 http://msdn.microsoft.com/en-us/library/t809ektx.aspx

自相矛盾地使用[a-zA-Z]你限制了你的用户...没有àèéìòù,也没有土耳其语ı和İ(第一个是没有点的小写,小写,第二个是i)http://en.wikipedia.org/wiki/Dotted_and_dotless_I的大写版本。 也许您可以使用(\p{L}\p{M}*)(带括号)而不是[A-Za-z](所有字母加上组合标记)。您必须在关闭括号后添加*或+ +。一个表达式是单个字母PLUS其组合标记。

哦......你可以使用其他建议之一作为正则表达式的基础: - )

答案 2 :(得分:0)

[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*[\d]+[\s]*

可以替换为......

\s*(?:\d+\s*){8}

(另外,你可以只写\s而不是[\s]\d而不是[\d] - 如果你只指定一个,那么括号是多余的反斜杠字符类。)

编辑由于关于原始正则表达式的哪个部分被替换似乎存在一些混淆,这里是替换后的整个表达式:

[A-Za-z]+\s*[A-Za-z]+\s*(?:\d+\s*){8}

答案 3 :(得分:0)

(?:[A-Za-z]+\s*){2}(?:\d+\s*){8}