C# 正则表达式:第一个字符字母表第二个数字

C# 正则表达式:第一个字符字母表第二个数字,c#,regex,C#,Regex,这是我的字符串,它总是以字母开头,后跟3位数字,然后是-(连字符),接着是3位数字,然后是字母,然后是4位数字 I123-123S1234N1234 我想出了一个正则表达式,它看起来很长!我怎样才能写出一个更好的表达式呢 [a-zA-Z][0-9][0-9][0-9][-][0-9][0-9][0-9][a-zA-Z].........goes on 注意 应支持不区分大小写 连字符,S和N始终保持不变 首先使用不区分大小写的标志,然后在重复令牌时,使用{}`而不是重复您自己: (?i)[

这是我的字符串,它总是以字母开头,后跟3位数字,然后是
-
(连字符),接着是3位数字,然后是字母,然后是4位数字

I123-123S1234N1234
我想出了一个正则表达式,它看起来很长!我怎样才能写出一个更好的表达式呢

[a-zA-Z][0-9][0-9][0-9][-][0-9][0-9][0-9][a-zA-Z].........goes on
注意

  • 应支持不区分大小写
  • 连字符,
    S
    N
    始终保持不变

首先使用不区分大小写的标志,然后在重复令牌时,使用
{
}`而不是重复您自己:

(?i)[a-z][0-9]{3}-[0-9]{3}[a-z][0-9]{4}
如果还想匹配尾随的
N1234
,则将最后的
[a-z][0-9]{4}
放入一个组中,并重复两次:

(?i)[a-z][0-9]{3}-[0-9]{3}(?:[a-z][0-9]{4}){2}

如果S和N是常量,则不要使用字符集来匹配它们,只需匹配普通字符:

(?i)[a-z][0-9]{3}-[0-9]{3}S[0-9]{4}N[0-9]{4}

这应该可以:

[a-zA-Z][0-9]{3}-[0-9]{4}[a-zA-Z][0-9]{4}

如果您确定有大写字母和S和N常量:

[A-Z]\d{3}-\d{3}S\d{4}N\d{4}
[A-Z]
-匹配任何大写字母

\d{3}
-匹配3位数字

S
-按字面匹配S

\d{4}
-匹配4位数字

N
-按字面意思匹配N

\d{4}
-匹配4位数字

如果需要大写和小写:

[a-zA-Z]\d{3}-\d{3}[Ss]\d{4}[Nn]\d{4}

试试这个:

var testString = "I123-123S1234N1234";
var pattern = @"[A-Za-z]\d{3}-\d{3}[sS]\d{4}[nN]\d{4}";
var isMatch = Regex.Match(testString, pattern).Success;
使用的模式:
[A-Za-z]\d{3}-\d{3}[sS]\d{4}[nN]\d{4}

说明:

[A-Za-z]
-匹配任何字母

\d{3}
-匹配三位数字

[sS]
-按字面意思匹配
S
S

\d{4}
-匹配四位数字

[nN]
-按字面意思匹配
N
N


\d{4}
-匹配四位数

\d也比[0-9]@fubo短很多,它使用不区分大小写的标志。他提到要用的。什么是(?i)here@bdebaere当您不想匹配时,最好避免使用
\d
——尽可能具体possible@kudlatiger
(?i)
是不区分大小写的标志,将标记为应答!但它也支持小写字母![a-z]有一个正则表达式选项,使它不区分大小写,从而使它更简单。@bradbury9是的,你是对的,但我更喜欢只在需要的时候使用标志。如果它总是固定格式,我想我会使用子字符串而不是正则表达式来拆分它。@HansKilian正则表达式是昂贵的操作吗?子字符串更容易编码和读取,我想。
var testString = "I123-123S1234N1234";
var pattern = @"[A-Za-z]\d{3}-\d{3}[sS]\d{4}[nN]\d{4}";
var isMatch = Regex.Match(testString, pattern).Success;