我相信这个正则表达式应该可以工作:
"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");