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

时间:2013-03-01 12:09:15

标签: c# regex

我的文件名必须如下所示:

A123456_B123456_v1.10_File Name.xml

我尝试创建一个正则表达式模式,该模式应验证文件名是否匹配。

模式是:

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)

2 个答案:

答案 0 :(得分:1)

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

"A\\d{6}_B\\d{6}_v\\d{1,3}\\.\\d{1,2}_.*?\\.xml"

圆括号不是必需的(虽然你可以保留它们),(\\*?)部分是错误的,因为它与A123456_B123456_v1.10_*A123456_B123456_v1.10_匹配,但不是{{1}并且A123456_B123456_v1.10_File Name应该是.xml,因为您希望文字\\.xml匹配,而不仅仅是任何字符。

带圆括号的版本

.
只有当你想要检索其中匹配的内容时才需要

修改

您的正则表达式无法正常工作的原因是因为您使用了"A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml" 错误。根据{{​​3}},它是Regex.IsMatch(输入,模式)

Regex.IsMatch

因为你正在做

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

你为什么不用它?

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

编辑2:

使用逐字符if (regex.IsMatch(fileName)) // do stuff

,而不是使用双重转义,您可以更容易阅读正则表达式
@

答案 1 :(得分:0)

比这更简洁,但它会起作用。

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;
        }
    }