2017-04-18 95 views
0

我想使用正则表达式来获得没有扩展名的文件名。我无法让正则表达式返回一个值。我有这样的:C#正则表达式获取没有扩展名的文件名?

string path = @"C:\PERSONAL\TEST\TESTFILE.PDF"; 
var name = Regex.Match(path, @"(.+?)(\.[^\.]+$|$)").Value; 

在这种情况下,name总是回来为C:\PERSONAL\TEST\TESTFILE.PDF。我做错了什么,我认为我的搜索模式是正确的?

(我知道我可以使用Path.GetFileNameWithoutExtension(path);但我特别想尝试使用正则表达式)

+4

为何要使用这个时候一个非常好的框架方法存在一个正则表达式?你可以使用一个正则表达式,但是你手上还会有一个额外的问题。 – Amy

+0

但为什么?寻找[麻烦](https://blog.codinghorror.com/regular-expressions-now-you-have-two-problems)? – dlatikay

+3

如果这只是为了学习正则表达式,那很好,但是对此使用正则表达式绝对没有理由。事实上,我认为在解决大多数问题时,正则表达式应该是您的最后手段。 – juharr

回答

1

你需要Group[1].Value

string path = @"C:\PERSONAL\TEST\TESTFILE.PDF"; 
var match = Regex.Match(path, @"(.+?)(\.[^\.]+$|$)"); 
if(match.Success) 
{ 
    var name = match.Groups[1].Value; 
} 

match.Value返回Captures.Value这是整场比赛

match.Group[0]始终与match.Value

match.Group[1]返回第一个捕获值

例如:

+0

你能解释一下为什么吗? – Stefan

+0

它是'Groups [2] .Value',而不是'1'。 '0'是整个输入字符串(因为两个捕获组一起匹配整个事物),'1'是(不必要的)首先捕获的组,'2'是第二个。 –

+0

@Stefan呃,我误以为你是OP。抱歉! –

1

由于数据是对字符串的右侧,告诉正则表达式解析器从字符串的工作结束通过使用选项RightToLeft开始。这将显着减少处理时间并减少实际需要的图案。

下面的模式从左到右读,并说,给我所有不是\字符(消耗/匹配到斜线,不再继续),并开始消耗一段时间。

Regex.Match(@"C:\PERSONAL\TEST\TESTFILE.PDF", 
      @"([^\\]+)\.", 
      RegexOptions.RightToLeft) 
     .Groups[1].Value 

打印出

TESTFILE

0

可能会有点短,贪婪:

var name = Regex.Replace(@"C:\PERS.ONAL\TEST\TEST.FILE.PDF", @".*\\(.*)\..*", "$1"); // "TEST.FILE" 
相关问题