从路径"//source/project/file.cs#232"
开始,我需要匹配file.cs
Match myMatch = Regex.Match(path, @"(\w+\.\w+)[^/]*$");
这将在组[1]中提供file.cs。
但是对于文件名中带点的路径,这不起作用。
path "//source/project/file.initial.config.cs#232"
我怎样才能修改它以使用file.initial.config.cs?
答案 0 :(得分:1)
试试这个正则表达式 - 也进入第1组,并假设扩展名只能是字母,数字或下划线:
.*/((?:.*?\.)+\w+)
如果需要,可以通过知道文件命名的允许字符和后缀,以及有关嵌入此文件名(if)的文本的详细信息,使其更加健壮。例如,如果不允许空格作为名称的一部分
.*/((?:\S*?\.)+\w+)
或者只允许使用字母,数字或下划线:
.*/((?:\w*?\.)+\w+)
如果我们可以确信在序列中的最后一个点之后没有点或空格,并且文件名中不允许有空格,则可以进一步缩短为:
.*/(\S*\.\w+)
获取最后一个“/”和最后一个“。”之间的所有内容。以及最后一个“。”之后的任何单词字符。
等
答案 1 :(得分:1)
'#'之前的一些非'/':
/([^/]+)#
答案 2 :(得分:1)
答案 3 :(得分:1)
您是否可以简单地将正则结构从(\w+\.\w+)[^/]*$
修改为(\w+(\.\w+)+)[^/]*$
,以允许多次出现.words
?
答案 4 :(得分:1)
为什么要使用正则表达式,当你可以在c#中做到这一点?
我为你创造了一个功能:
public static class FileNameHelper
{
public static string GetFileNameFromPath(string path, string extWithoutdot = "cs")
{
var startIndex = path.LastIndexOf('/') + 1;
var stringg = path.Substring(startIndex);
var remIndex = stringg.LastIndexOf("." + extWithoutdot) + extWithoutdot.Length+1;
return stringg.Remove(remIndex);
}
}
如何使用?
string filename=FileNameHelper.GetFileNameFromPath("//source/project/file.initial.config.cs#232","cs");
请记住使用不带.
看到这比正则表达式有很多优势。他们是:
注意:不要在c#中使用正则表达式来处理琐碎的事情。这绝对是对性能的打击。首先想一想在c#中实现它的方法。正则表达式应该是最后的手段。当然,如果性能无关紧要,请使用!
顺便说一句,如果它有帮助,请将其标记为答案。 我知道它会有所帮助:)
答案 5 :(得分:1)
如果你不反对避免使用正则表达式,你可以通过一小段字符串操作来做到这一点:
string mypath = "//source/project/file.initial.config.cs#232";
string filename = GetFileName(mypath);
static string GetFileName(string path)
{
var pathPieces = path.Split('/').Last().Split('#');
var filename = pathPieces.Take(pathPieces.Length - 1);
return String.Join("#", filename);
}
更简单,适用于任意文件名(即使是带空格或#字符的文件名)。
编辑:现在使用包含#个字符的文件名,尽管Perforce中的highly discouraged。
答案 6 :(得分:0)
(?<=/)[^/]+(?=#)
使用环视,它只匹配文件名。