1

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

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)
4

2 回答 2

1

我相信这个正则表达式应该可以工作:

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

圆括号不是必需的(尽管您可以将它们保留原样),该(\\*?)部分是错误的,因为它匹配A123456_B123456_v1.10_*or A123456_B123456_v1.10_,但不是A123456_B123456_v1.10_File Name,而是.xml应该匹配\\.xml,因为您想要.匹配文字,而不仅仅是任何字符。

带圆括号的版本

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

仅当您想检索其中匹配的任何内容时才需要。

编辑:

您的正则表达式不起作用的原因是您使用Regex.IsMatch错误。根据MSDN,它是 Regex.IsMatch(input, pattern)

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");

你为什么不使用它?

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");
于 2013-03-01T12:18:15.203 回答
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;
        }
    }
于 2013-03-01T12:24:29.863 回答