繁体   English   中英

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

[英]Regex pattern match a filename

我有一个文件名,它必须看起来像这样:

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)

我相信此Regex应该可以工作:

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

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

带圆括号的版本

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

有比这更清洁的方法,但是它可以工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM