我想使用正则表达式来获取没有扩展名的文件名。我在使用正则表达式返回值时遇到问题。我有这个:
string path = @"C:\PERSONAL\TEST\TESTFILE.PDF";
var name = Regex.Match(path, @"(.+?)(\.[^\.]+$|$)").Value;
在这种情况下,name
始终以C:\PERSONAL\TEST\TESTFILE.PDF
的形式返回。我做错了什么,我认为我的搜索模式是正确的?
(我知道我可以使用Path.GetFileNameWithoutExtension(path);
,但我特别想尝试使用正则表达式)
答案 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"