C# 正则表达式,用于匹配一组字母数字,后跟一组空格,形成固定的字符总数

C# 正则表达式,用于匹配一组字母数字,后跟一组空格,形成固定的字符总数,c#,.net,regex,C#,.net,Regex,我正在尝试使用C#/.Net编写一个正则表达式,它匹配1-4个字母数字,后跟空格,后跟10个数字。陷阱是空格数加上字母数字的数目必须等于4,空格必须跟随字母数字,而不是散布 我完全不知道该怎么做。我可以做^[A-Za-z\d\s]{1,4}[\d]{10}$,但这会让空格落在前四个字符的任何位置。或者我可以使用^[A-Za-z\d]{1,4}[\s]{0,3}[\d]{10}$将空格保持在一起,但这将允许在10位数字之前总共有四个以上的字符 有效期: A12B1234567890 AB1 123

我正在尝试使用C#/.Net编写一个正则表达式,它匹配1-4个字母数字,后跟空格,后跟10个数字。陷阱是空格数加上字母数字的数目必须等于4,空格必须跟随字母数字,而不是散布

我完全不知道该怎么做。我可以做
^[A-Za-z\d\s]{1,4}[\d]{10}$
,但这会让空格落在前四个字符的任何位置。或者我可以使用
^[A-Za-z\d]{1,4}[\s]{0,3}[\d]{10}$
将空格保持在一起,但这将允许在10位数字之前总共有四个以上的字符

有效期:
A12B1234567890
AB1 1234567890
AB 1234567890

无效:
AB1 1234567890(数字前超过4个字符)
A1B1234567890(数字前少于4个字符)
A1 B1234567890(前4个字符中间的空格而不是末尾)

这是您需要的正则表达式:

它使用一个
(?=)
来测试它后面是否有4个字符,alnum或space,然后返回到原来的位置(字符串的填充,不消耗任何字符)

一旦满足该条件,其余的表达式与您尝试的表达式非常相似(
[a-Za-z0-9]{1,4}*\d{10}


我知道这很愚蠢,但必须完全按照要求工作

^[A-Za-z\d]([A-Za-z\d]{3}|[A-Za-z\d]{2}\s|[A-Za-z\d]\s{2}|\s{3})[\d]{10}$

您可以通过查看后面的
(?不确定要查找什么,但可能:

^(?=.{14}$)[A-Za-z0-9]{1,4} *\d{10}
试试这个:

不允许char/space/char组合并以char开头:

/\b(?!\w\s{1,2}\w+)\w(\w|\s){3}\d{10}/gm

请明确定义您的标准。我不确定这将允许在10位数之前总共超过4个字符。如果您至少需要1个空格怎么办?
^[a-Za-z\d]{1,4}\s{1,3}\d{10}$
。包含一组匹配字符和非匹配字符会非常有帮助。要清楚,如果开头有4个字母数字字符,没有空格是有效的,不是吗?如果有10个左右的空格,它也会匹配…:(@elgonzo:no.lookahead
(?=[a-Za-z0-9]{4}\d)
确保(alnum+spaces)=4Damn,我错过了前瞻模式中的
\d
——我的错。您的正则表达式似乎是正确的……对不起:)这不允许无限的空格,但允许前缀中的字符太少。ABC1234567890是可以接受的,即使在十位数字之前少于四个字符。@jvance:nice catch。我编辑了答案以更正它。前瞻现在是
(?=[A-Za-z0-9]{4}\d{10}$)
这是可行的,但是Stribizev的外观看起来更优雅。感谢您的帮助。一个稍微紧凑的替代方案:
^[\p{L}\d](?具有更少的可读性:)@elgonzo:如果我可以选择一个正则表达式,在有交替和没有交替的情况下产生相同的结果,我会选择一个没有交替的正则表达式。当对
A12B1234567890
进行测试时,我的正则表达式显示,与您建议的正则表达式相比,性能提高了15%。这很有趣。我刚刚注意到,我没有使用非捕获组进行交替-我在onder由于捕获组(如果有的话)造成的性能损失有多大……我想我会测试:)无论如何,我更喜欢你的解决方案,因为它更容易从左到右“阅读”,而我的则真的不那么容易理解:)Regexero上的这个正则表达式基准有相当多的气质(可能会对浏览器环境造成影响?)。运行与您的正则表达式完全相同的基准测试20次,我看到性能波动约为8%。然后,我对我的正则表达式进行基准测试,无论是否使用非捕获组,每次测试20次——使用非捕获组的版本出人意料地慢(大约比您的正则表达式慢7..8%)。我的正则表达式和一个捕获组平均只落后你几个百分点,一个基准运行速度甚至比我用你的正则表达式运行的所有速度都快。我不知道该怎么办……这种方法清楚地表明了开箱思维!你没有试着满足所有条件,而是采用了它背后的逻辑。+1这也是原因所在我建议。或者,长度检查可以在正则表达式之外完成。
^(?=.{14}$)[A-Za-z0-9]{1,4} *\d{10}
/\b(?!\w\s{1,2}\w+)\w(\w|\s){3}\d{10}/gm