2014-02-06 91 views
1

提取文件名从路径"//source/project/file.cs#232",我需要匹配file.cs正则表达式从P4路径

Match myMatch = Regex.Match(path, @"(\w+\.\w+)[^/]*$"); 

这将使file.cs成群[1]。

但是,对于文件名中带有点的路径,这不起作用。

path "//source/project/file.initial.config.cs#232" 

我怎么能修改这个工作给file.initial.config.cs?

回答

1

试试这个正则表达式 - 也为1组,并假设扩展只可以是字母,数字或下划线:

.*/((?:.*?\.)+\w+) 

这可以变得更加健壮,如果有必要,在允许的知识用于文件命名的字符和后缀,以及有关嵌入此文件名的文本的详细信息。例如,如果空间不允许作为名称的一部分

.*/((?:\S*?\.)+\w+) 

,或者是字母,数字或下划线被允许:

.*/((?:\w*?\.)+\w+) 

如果我们可以放心,不会有任何点或在文件名中不允许序列中的最后一个点后,空间,空间,它可以进一步简化为:

.*/(\S*\.\w+) 

到最后的“/”和上一次的拿起一切“”以及最后一个“。”之后的任何单词字符。

1

一些非 - 之前“#”“/”:

/([^/]+)# 
1

这应该让你做你想要什么,或者至少给你如何更好的主意实现它:

/(\w+)(?:\..*)(\w{2,3})\#) 

•例如:http://regex101.com/r/wQ9jG2

1

你能不能简单地修改你的正则表达式从(\w+\.\w+)[^/]*$(\w+(\.\w+)+)[^/]*$,允许多次出现.words

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"); 

记住使用扩展不.

看到这个拥有超过正则表达式很多优势。它们是:

  1. 它不是正则表达式!
  2. 其快速高效。
  3. 它的可读性和纯C#

注:不要使用在C#中的正则表达式琐碎的事情。这绝对是对性能的一个打击。首先想想在c#中实现它的方法。正则表达式应该是最后的手段。当然,如果表现不重要,请使用任何!

顺便说一句,如果它有帮助,将其标记为答案。 我知道它会帮助:)

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

+1

如果文件名包含'#'会怎么样? – jamesdlin

+0

那些是不好的juju,但我已经编辑了我的答案来解释它们。使它稍微复杂一些,但并不过分。 – Mark

0
(?<=/)[^/]+(?=#) 

使用环视,它只匹配文件名。