繁体   English   中英

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

[英]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{2,3})\#)

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

您是否可以不简单地将正则表达式从(\\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");

记住不要使用扩展名.

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

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

注意:不要在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM