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时都编译这个项目。您可以通过使用逐字字符串文字来摆脱所有的双重转义。@ο是的,我将更新我的答案以提及这种可能性