C#Regex获取没有扩展名的文件名?

时间:2017-04-18 14:44:08

标签: c# regex

我想使用正则表达式来获取没有扩展名的文件名。我在使用正则表达式返回值时遇到问题。我有这个:

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

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

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

4 个答案:

答案 0 :(得分: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]返回第一个捕获值

例如:

string path = @"C:\PERSONAL\TEST\TESTFILE.PDF";
var match = Regex.Match(path, @"(.+?)(\.[^\.]+$|$)");
if(match.Success)
{
    Console.WriteLine(match.Value);
    // return the substring of the matching part
    //Output: C:\\PERSONAL\\TEST\\TESTFILE.PDF 
    Console.WriteLine(match.Groups[0].Value)
    // always the same as match.Value
    //Output: C:\\PERSONAL\\TEST\\TESTFILE.PDF 
    Console.WriteLine(match.Groups[1].Value)
    // return the first capture group which is (.+?) in this case
    //Output: C:\\PERSONAL\\TEST\\TESTFILE 
    Console.WriteLine(match.Groups[2].Value)
    // return the second capture group which is (\.[^\.]+$|$) in this case
    //Output: .PDF 

}

答案 1 :(得分:1)

由于数据位于字符串的右侧,因此请使用选项RightToLeft告诉正则表达式解析器从字符串的端到开始工作。这将显着缩短处理时间并减少所需的实际模式。

下面的模式从左到右读取并说,给我一切不是\字符的东西(消耗/匹配斜线而不是继续前进)并开始消耗一段时间。

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

打印

  

TESTFILE

答案 2 :(得分:0)

试试这个:

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
</init-param>

对于Windows:

.*(?=[.][^OS_FORBIDDEN_CHARACTERS]+$)

这是一个简单的修改: Regular expression get filename without extention from full filepath

如果您可以匹配禁用的字符,那么最简单的正则表达式将是:

OS_FORBIDDEN_CHARACTERS = :\/\\\?"><\|

答案 3 :(得分:0)

可以更短更贪婪:

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