Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Regex是否可以获取不带扩展名的文件名?_C#_Regex - Fatal编程技术网

C#Regex是否可以获取不带扩展名的文件名?

C#Regex是否可以获取不带扩展名的文件名?,c#,regex,C#,Regex,我想使用正则表达式来获取一个没有扩展名的文件名。我无法让正则表达式返回值。我有这个: string path = @"C:\PERSONAL\TEST\TESTFILE.PDF"; var name = Regex.Match(path, @"(.+?)(\.[^\.]+$|$)").Value; 在这种情况下,name总是以C:\PERSONAL\TEST\TESTFILE.PDF的形式返回。我做错了什么,我认为我的搜索模式是正确的 (我知道我可以使用Path.GetFileNameWith

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

string path = @"C:\PERSONAL\TEST\TESTFILE.PDF";
var name = Regex.Match(path, @"(.+?)(\.[^\.]+$|$)").Value;
在这种情况下,
name
总是以
C:\PERSONAL\TEST\TESTFILE.PDF
的形式返回。我做错了什么,我认为我的搜索模式是正确的


(我知道我可以使用
Path.GetFileNameWithoutExtension(Path);
但我特别想尝试使用regex)

您需要
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
返回整个匹配的
捕获.Value

match.value组[0]
始终与
match.value具有相同的值

string path = @"C:\PERSONAL\TEST\TESTFILE.PDF";
var match = Regex.Match(path, @"(.+?)(\.[^\.]+$|$)");
if(match.Success)
{
    var name = match.Groups[1].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]。值

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

match.value组[0]
始终与
match.value具有相同的值

string path = @"C:\PERSONAL\TEST\TESTFILE.PDF";
var match = Regex.Match(path, @"(.+?)(\.[^\.]+$|$)");
if(match.Success)
{
    var name = match.Groups[1].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 

}
试试这个:

.*(?=[.][^OS_FORBIDDEN_CHARACTERS]+$)
对于Windows:

OS_FORBIDDEN_CHARACTERS = :\/\\\?"><\|
试试这个:

.*(?=[.][^OS_FORBIDDEN_CHARACTERS]+$)
对于Windows:

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

由于数据位于字符串的右侧,请使用选项
RightToLeft
告诉正则表达式解析器从字符串的末尾到开头工作。这将大大减少处理时间,并减少实际需要的模式

下面的模式是从左到右读的,上面写着,给我所有不是
\
字符的东西(消耗/匹配到斜杠,不要再往前走),然后开始消耗到一个句号

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

测试文件


由于数据位于字符串的右侧,请使用选项
RightToLeft
告诉正则表达式解析器从字符串的末尾到开头工作。这将大大减少处理时间,并减少实际需要的模式

下面的模式是从左到右读的,上面写着,给我所有不是
\
字符的东西(消耗/匹配到斜杠,不要再往前走),然后开始消耗到一个句号

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

测试文件


可以短一点,更贪婪一点:

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

可以短一点,更贪婪一点:

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

既然存在一个非常好的框架方法,为什么还要使用正则表达式呢?你可以使用正则表达式,但是你会有一个额外的问题。但是为什么呢?寻找?如果这只是为了学习正则表达式,那没关系,但绝对没有理由使用正则表达式来实现这一点。事实上,我认为正则表达式应该是解决大多数问题的最后手段。你所犯的错误是调用一个方法而没有首先在MSDN上查找它,得到一个你不期望的结果,然后仍然懒得阅读文档。您不知道
Regex.Match()
返回的是什么,它显然不是您所猜测的,所以您来这里是想让某人大声读MSDN页面。如果MSDN太可怕,请运行此命令并在其后面粘贴一个断点:
var result=Regex.Match(路径,@“(.+?)(\.[^.]+$)”
将鼠标悬停在
结果
上,查看方法返回的内容。编程就是这样。既然有一个非常好的框架方法,为什么还要使用正则表达式呢?你可以使用正则表达式,但是你会有一个额外的问题。但是为什么呢?寻找?如果这只是为了学习正则表达式,那没关系,但绝对没有理由使用正则表达式来实现这一点。事实上,我认为正则表达式应该是解决大多数问题的最后手段。你所犯的错误是调用一个方法而没有首先在MSDN上查找它,得到一个你不期望的结果,然后仍然懒得阅读文档。您不知道
Regex.Match()
返回的是什么,它显然不是您所猜测的,所以您来这里是想让某人大声读MSDN页面。如果MSDN太可怕,请运行此命令并在其后面粘贴一个断点:
var result=Regex.Match(路径,@“(.+?)(\.[^.]+$)”
将鼠标悬停在
结果
上,查看方法返回的内容。这就是编程。你能解释为什么吗?它是
组[2]。值
,而不是
1
0
是整个输入字符串(因为两个捕获组一起匹配整个字符串),
1
是(不必要的)第一个捕获组,
2
是第二个。@Stefan哎哟,我把你错当成OP了。对不起!你能解释一下原因吗?这是
组[2]。值
,而不是
1
0
是整个输入字符串(因为两个捕获组一起匹配整个字符串),
1
是(不必要的)第一个捕获组,
2
是第二个。@Stefan哎哟,我把你错当成OP了。对不起!