从文件路径中删除动态用户名

时间:2012-12-20 07:42:33

标签: c# regex filepath

我在C#中有以下内容。

string fileName = @"X:\Users\username\AppData\Local\foo.txt";

我想执行一个Regex.Replace,以便我得到以下回复。

string fileName = @"X:\Users\AppData\Local\foo.txt";

使用允许驱动器号(X:)动态的正则表达式会很不错。从本质上讲,我只需要删除“username”部分。另请注意,用户名只是用户实际名称的占位符 - 因此可以是bob或larry或john或其他任何内容。正则表达式需要考虑到这一点。

您可以依赖的是,它始终以X:\Users\开头(其中X:可以是C:D:等)然后会跟随一些字符串,然后是\,然后是一些不重要的其他路径元素。此外,在users or Users上进行不区分大小写的匹配会很好。

我知道这可以在没有Regex的情况下完成,但我需要将其放入一个仅提供Regex支持的更大系统中。对String.ReplaceString.Join等内容不支持。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下示例:

string fileName = @"X:\Users\username\AppData\Local\foo.txt";
Console.Write(Regex.Replace(fileName, @"([A-Z]{1}\:*\\Users\\)(\w+\\)(.*)", "$1$3"));

说明:

  1. ([A-Z]{1}\:\\[Uu]sers\\) - 正则表达式的这一部分是第一组字符,在username之前,在路径中
    • ^代表行的开头(删除此项以忽略文件名前的字词)
    • [A-Z]{1}\:\\代表磁盘根路径。您可以选择要在此处的磁盘字母,如下所示:[CDX-Z]{1}。注意{1} - 这是约束意味着您只需要1个大写字母。
    • [Uu]sers\\代表用户目录名称,请注意不区分大小写的用户路径的组 这是第一组,在替换模式中称为$1
  2. (\w+\\) - 正则表达式的这一部分是路径中的第二组字符username
    • \w+\\代表至少一个字符和\符号。 这是第二组,不是替换模式
  3. (.*) - 正则表达式的这一部分是username之后的第三组字符,位于路径中
    • .*代表删除\符号后的任何字符。
  4. 更新: 在现实世界中,我发现用户名包含空格,unicode字符和〜。所以我将2.组替换为包含\符号的任何字符。

    string fileName = @"X:\Users\username\AppData\Local\foo.txt";
    Console.Write(Regex.Replace(fileName, @"([A-Z]{1}\:\\[Uu]sers\\)([^\\]*\\)(.*)", "$1$3"));