C# 正则表达式模式匹配文件名

C# 正则表达式模式匹配文件名,c#,regex,C#,Regex,我有一个文件名,它必须如下所示: A123456_B123456_v1.10_File Name.xml 我尝试创建一个regex模式,它应该验证文件名是否匹配 模式是: Regex regex = new Regex("A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(\\*?).xml"); 它不起作用 你能帮我修一下吗 工作示例 string fileName = "A545656_B958432_v12.8_Upload 1.xml"; Reg

我有一个文件名,它必须如下所示:

A123456_B123456_v1.10_File Name.xml
我尝试创建一个regex模式,它应该验证文件名是否匹配

模式是:

Regex regex = new Regex("A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(\\*?).xml");
它不起作用

你能帮我修一下吗

工作示例

string fileName = "A545656_B958432_v12.8_Upload 1.xml";

Regex.IsMatch("A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml", fileName)

我相信这个正则表达式应该有效:

"A\\d{6}_B\\d{6}_v\\d{1,3}\\.\\d{1,2}_.*?\\.xml"
圆括号是不必要的(尽管您可以保持原样),
(\\*?)
部分是错误的,因为它与
A123456\u B123456\u v1.10\u*
A123456\u B123456\u v1.10\u匹配,而不是
A123456\u B123456\u v1.10\u文件名
,而
.xml
应该是
\.xml
,因为您需要匹配的是文字
,而不仅仅是任何字符

带圆括号的版本

"A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml"
仅当您要检索其中匹配的内容时才需要

编辑:

您的正则表达式不工作的原因是您使用的
Regex.IsMatch
错误。根据,它是Regex.IsMatch(输入,模式)

既然你在做

Regex regex = new Regex("A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml");
你为什么不用它

if (regex.IsMatch(fileName))
    // do stuff
编辑2:

您可以使用逐字字符
@

Regex regex = new Regex(@"A(\d{6})_B(\d{6})_v(\d{1,3}\.\d{1,2})_(.*?)\.xml");

我相信这个正则表达式应该有效:

"A\\d{6}_B\\d{6}_v\\d{1,3}\\.\\d{1,2}_.*?\\.xml"
圆括号是不必要的(尽管您可以保持原样),
(\\*?)
部分是错误的,因为它与
A123456\u B123456\u v1.10\u*
A123456\u B123456\u v1.10\u匹配,而不是
A123456\u B123456\u v1.10\u文件名
,而
.xml
应该是
\.xml
,因为您需要匹配的是文字
,而不仅仅是任何字符

带圆括号的版本

"A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml"
仅当您要检索其中匹配的内容时才需要

编辑:

您的正则表达式不工作的原因是您使用的
Regex.IsMatch
错误。根据,它是Regex.IsMatch(输入,模式)

既然你在做

Regex regex = new Regex("A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml");
你为什么不用它

if (regex.IsMatch(fileName))
    // do stuff
编辑2:

您可以使用逐字字符
@

Regex regex = new Regex(@"A(\d{6})_B(\d{6})_v(\d{1,3}\.\d{1,2})_(.*?)\.xml");

有一种比这更干净的方法,但它会起作用

private void textBox1_TextChanged(object sender, EventArgs e)
        {

        string Reg = "^[A]{1}[0-9]{6}[_]{1}[B]{1}[0-9]{6}[_]{1}[v]{1}[1]{1}[.]{1}[1]{1}[0]{1}[_]*";

        if (Regex.IsMatch(textBox1.Text, Reg))
        {
            textBox1.BackColor = Color.Green;
            textBox1.ForeColor = Color.White;
        }
        else
        {
            textBox1.BackColor = Color.White;
            textBox1.ForeColor = Color.Black;
        }
    }

有一种比这更干净的方法,但它会起作用

private void textBox1_TextChanged(object sender, EventArgs e)
        {

        string Reg = "^[A]{1}[0-9]{6}[_]{1}[B]{1}[0-9]{6}[_]{1}[v]{1}[1]{1}[.]{1}[1]{1}[0]{1}[_]*";

        if (Regex.IsMatch(textBox1.Text, Reg))
        {
            textBox1.BackColor = Color.Green;
            textBox1.ForeColor = Color.White;
        }
        else
        {
            textBox1.BackColor = Color.White;
            textBox1.ForeColor = Color.Black;
        }
    }

*?
替换
(\\\*?)
怎么样?您当前正在匹配一个文本,这不是您想要的(我猜)-这是有史以来最好的事情。您也会想逃离最后一段时间-
\.xml
这很有效,但它的巨大lol:-string Reg=“^[a-Z]{1}[0-9]{6}[]{a-Z]{1}[0-9]{6}[]{1}[v]{1}[1]{1]{1]{1]{1}{1}{,但我需要像上面一样的东西。我差一点了,但我没法用
*?
替换
(\\*?)
?您当前正在匹配一个文本,这不是您想要的(我猜)-这是有史以来最好的事情。您也会想逃离最后一段时间-
\.xml
这很有效,但它的巨大lol:-string Reg=“^[a-Z]{1}[0-9]{6}[]{a-Z]{1}[0-9]{6}[]{1}[v]{1}[1]{1]{1]{1]{1}{1}{,但我需要像上面一样的东西。我很接近,但我无法让它工作。我不检查它是否以.xml结尾。我知道我可以单独检查,但我更愿意这样做,而不是检查它是否以.xml结尾。我知道我可以单独检查,但我更愿意在这里检查!我根本没有意识到这一点!我在调试器中测试它,我不想每次修改Regex时都编译该项目。您可以通过使用逐字字符串文字来摆脱所有的双重转义。@ο是的,我将更新我的答案,以提及可能性提示我!我根本没有意识到这一点!我是在调试器中测试它的,我不想每次修改regex时都编译这个项目。您可以通过使用逐字字符串文字来摆脱所有的双重转义。@ο是的,我将更新我的答案以提及这种可能性