[英]Regular expression to extract file name from p4 path
从路径"//source/project/file.cs#232"
,我需要匹配file.cs
Match myMatch = Regex.Match(path, @"(\w+\.\w+)[^/]*$");
这将成组地提供file.cs [1]。
但是,对于文件名中带有点的路径,此操作无效。
path "//source/project/file.initial.config.cs#232"
我如何修改它以提供给file.initial.config.cs?
尝试此正则表达式-也属于第1组,并假设扩展名只能是字母,数字或下划线:
.*/((?:.*?\.)+\w+)
如有必要,可以通过了解文件命名所允许的字符和后缀以及有关嵌入此文件名(如果有)的文本的详细信息,从而使其更加可靠。 例如,如果名称中不允许使用空格
.*/((?:\S*?\.)+\w+)
或仅允许使用字母,数字或下划线:
.*/((?:\w*?\.)+\w+)
如果可以确保序列中最后一个点之后没有点或空格,并且文件名中不允许有空格,则可以将其进一步缩短为:
.*/(\S*\.\w+)
拾取最后一个“ /”和最后一个“。”之间的所有内容。 以及最后一个“。”之后的任何单词字符
等等
在“#”之前的多个非“ /”:
/([^/]+)#
您是否可以不简单地将正则表达式从(\\w+\\.\\w+)[^/]*$
为(\\w+(\\.\\w+)+)[^/]*$
以允许多次出现.words
?
当可以在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#实现它的方法。 正则表达式应该是不得已的方法。 当然,如果性能无关紧要,请使用!
顺便说一句,如果有帮助,请将其标记为答案。 我知道这会有所帮助的:)
如果您不反对避免使用正则表达式,则可以通过少量的字符串操作来做到这一点:
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中不建议使用这些文件名。
(?<=/)[^/]+(?=#)
使用环视,它仅匹配文件名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.