代码之家  ›  专栏  ›  技术社区  ›  sanya

Regx替换最后一个模式

  •  0
  • sanya  · 技术社区  · 3 年前

    我有一个字符串,它是一个文件路径:

    string test = "C:\Users\Folder\File.txt";
    

    我想做的是替换最后一个反斜杠之后的所有内容,即test文件名。 我试着这样做:

                string test = "C:\\Users\\Folder\\File.txt";
                Regex rx = new Regex(@"\\S*(?!.*\\)");
                string result = rx.Replace(test, "\\test.txt"); 
    

    但这给了我:C:\Users\Folder\test。txtFile。txt“而不是C:\Users\Folder\test.txt”,我做错了什么?

    3 回复  |  直到 3 年前
        1
  •  2
  •   Cetin Basoz    3 年前

    我不会用正则表达式这么做,但Path真的:

    string test = "C:\\Users\\Folder\\File.txt";
    Regex rx = new Regex(@"\\S*(?!.*\\).*");
    string result = rx.Replace(test, "\\test.txt");
    
    Console.WriteLine(result);
    
    var betterWay = Path.Combine(Path.GetDirectoryName(test), "test.txt");
    Console.WriteLine(betterWay);
    
        2
  •  1
  •   Nigel    3 年前

    .Net为此提供了内置函数。使用 Path 课程:

    var path = @"C:\Users\Folder\File.txt";
    var directory = Path.GetDirectoryName(path);
    var result = Path.Combine(directory, "test.txt");
    
        3
  •  1
  •   gunr2171    3 年前

    一种更简单的方法,不使用lookarounds

    ^(.+\\)(.+)$
    

    贪婪地匹配最后一个反斜杠之前的所有字符作为第一组,然后捕获所有剩余字符作为第二组。

    string test = @"C:\Users\Folder\File.txt";
    var pattern = new System.Text.RegularExpressions.Regex(@"(^.+\\)(.+)$");
    var match = pattern.Match(test);
    Console.WriteLine(match.Groups[1].Value);
    Console.WriteLine(match.Groups[2].Value);
    

    第一组是 C:\Users\Folder\ ,第二组 File.txt .

    这样做的局限性是,它只接受反斜杠作为分隔符。