正则表达式从p4路径中提取文件名

时间:2014-02-06 12:16:32

标签: c# .net regex perforce

从路径"//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?

7 个答案:

答案 0 :(得分:1)

试试这个正则表达式 - 也进入第1组,并假设扩展名只能是字母,数字或下划线:

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

如果需要,可以通过知道文件命名的允许字符和后缀,以及有关嵌入此文件名(if)的文本的详细信息,使其更加健壮。例如,如果不允许空格作为名称的一部分

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

或者只允许使用字母,数字或下划线:

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

如果我们可以确信在序列中的最后一个点之后没有点或空格,并且文件名中不允许有空格,则可以进一步缩短为:

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

获取最后一个“/”和最后一个“。”之间的所有内容。以及最后一个“。”之后的任何单词字符。

答案 1 :(得分:1)

'#'之前的一些非'/':

/([^/]+)#

答案 2 :(得分:1)

这应该可以让你做你想做的事,或者至少让你更好地了解如何实现它:

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

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

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

请记住使用不带.

的扩展程序

看到这比正则表达式有很多优势。他们是:

  1. 它不是正则表达式!
  2. 快速高效。
  3. 其可读性和纯粹的c#
  4. 注意:不要在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)

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

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