C# 使用正则表达式验证字符串

C# 使用正则表达式验证字符串,c#,regex,C#,Regex,我正在尝试用这个正则表达式验证字符串 var regexAgencia = new Regex("^(?!0000)([0-9]{4})"); var result = regexAgencia.IsMatch(agencia); 有效选项: N-X NN-X NNN-X NNNN-X N NN NNN NNNN 无效选项: 0-X 00-X 000-X 0000-X 0 00 000 0000 其中N是任何数字0-9,X可以是X或0-9 当我验证这个“01477417”时,正则表达式返回

我正在尝试用这个正则表达式验证字符串

var regexAgencia = new Regex("^(?!0000)([0-9]{4})");
var result = regexAgencia.IsMatch(agencia);
有效选项:

N-X
NN-X
NNN-X
NNNN-X
N
NN
NNN
NNNN
无效选项:

0-X
00-X
000-X
0000-X
0
00
000
0000
其中N是任何数字0-9,X可以是X或0-9

当我验证这个“01477417”时,正则表达式返回true


我需要帮助来编写一个正则表达式来使用这些规则验证这个字符串。

您当然可以通过正则表达式来完成这项工作,但是,我总是担心创建以下代码:

1) 只有我明白或记得 2) 回首往事,连我都不明白

本着这种精神,如果您进行简单的拆分,您的字符串可能更容易评估:

string[] parts = agencia.Split('-');
if ((parts.Length == 1 && Regex.IsMatch(agencia, @"^\d{1,4}$")) ||
    (parts.Length == 2 && Regex.IsMatch(parts[0], @"^\d{1,4}$")) && 
        Regex.IsMatch(parts[1], @"^[0-9X]$"))
{

}
--编辑--


我无法判断您是否需要0,因此如果不需要,请将
\d
从更改为
[1-9]

您当然可以通过正则表达式来实现这一点,但是,我始终担心创建以下代码之一:

1) 只有我明白或记得 2) 回首往事,连我都不明白

本着这种精神,如果您进行简单的拆分,您的字符串可能更容易评估:

string[] parts = agencia.Split('-');
if ((parts.Length == 1 && Regex.IsMatch(agencia, @"^\d{1,4}$")) ||
    (parts.Length == 2 && Regex.IsMatch(parts[0], @"^\d{1,4}$")) && 
        Regex.IsMatch(parts[1], @"^[0-9X]$"))
{

}
--编辑--


我无法判断您是否想要0,因此如果您不想要,请将
\d
从更改为
[1-9]

这应该可以为您做到:

^(?=\d*[1-9])\d{1,4}(?:-[X\d])?$
它从正向展望开始,以确保存在除零以外的数字(
(?=\d*[1-9])
)。此后,它匹配1-4个数字,可选地后跟连字符和数字或
X


.

这应该可以为您做到:

^(?=\d*[1-9])\d{1,4}(?:-[X\d])?$
它从正向展望开始,以确保存在除零以外的数字(
(?=\d*[1-9])
)。此后,它匹配1-4个数字,可选地后跟连字符和数字或
X


.

有两个测试比较容易:一个是检查它是否有效,另一个是排除所有前导零无效的特殊情况:

static void Main(string[] args)
{
    string[] agencias = { "", "1234-5", "0-9", "014777417", "0000", "1-23", "01-0", "1-234 abcd", "0123-4" };

    var regexAgenciaValid = new Regex("^(([0-9]{1,4})(-[0-9])?)$");
    var regexAgenciaInvalid = new Regex("^((0{1,4})(-[0-9])?)$");

    foreach (string agencia in agencias)
    {
        var result = regexAgenciaValid.IsMatch(agencia) && !regexAgenciaInvalid.IsMatch(agencia);
        Console.WriteLine(agencia + " " + result);
    }

    Console.ReadLine();

}
输出:

 False
1234-5 True
0-9 False
014777417 False
0000 False
1-23 False
01-0 True
1-234 abcd False
0123-4 True

这样做的好处是将来更容易修改。

进行两个测试会更容易:一个是检查它是否有效,另一个是排除所有前导零无效的特殊情况:

static void Main(string[] args)
{
    string[] agencias = { "", "1234-5", "0-9", "014777417", "0000", "1-23", "01-0", "1-234 abcd", "0123-4" };

    var regexAgenciaValid = new Regex("^(([0-9]{1,4})(-[0-9])?)$");
    var regexAgenciaInvalid = new Regex("^((0{1,4})(-[0-9])?)$");

    foreach (string agencia in agencias)
    {
        var result = regexAgenciaValid.IsMatch(agencia) && !regexAgenciaInvalid.IsMatch(agencia);
        Console.WriteLine(agencia + " " + result);
    }

    Console.ReadLine();

}
输出:

 False
1234-5 True
0-9 False
014777417 False
0000 False
1-23 False
01-0 True
1-234 abcd False
0123-4 True

这样做的好处是以后更容易修改。

你需要更详细地描述你的问题,我真的不知道你为什么认为
01477417
不应该匹配regexp
^(?!0000)([0-9]{4})
这意味着:如果(以非“0000”开头,有4位数字)问题是什么?为什么这些选项无效?在你的规则中,什么是N,什么是X?
-
应该是文本还是只是为了可视化?N是0到9之间的任意数字,X可以是X,或者是0到9之间的任意数字。这个01477417是无效的选项。你需要更详细地描述你的问题,我真的不知道为什么你认为
01477417
不应该匹配regexp
^(?0000)([0-9]{4})
意思是:如果(以非“0000”开头,有4位数字)问题是什么?为什么这些选项无效?在你的规则中,什么是N,什么是X?
-
应该是文本还是仅用于可视化?N是介于0和9之间的任意数字,X可以是X或介于0和9之间的任意数字此01477417是无效选项