[英]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.