0

我在 C# 中有以下内容。

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

我想执行 aRegex.Replace以便我得到以下内容。

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

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

您可以在这里指望的是它总是以X:\Users\(其中 X: 可以是C:orD:等​​)开头,然后是一些字符串,然后是 a \,然后是其他一些不是的路径元素重要的。此外,最好在 . 上进行不区分大小写的匹配users or Users

我知道这可以在没有的情况下完成Regex,但我需要它以适应仅提供Regex支持的更大系统。不支持像String.Replaceor之类的东西String.Join

4

1 回答 1

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路径中的, 之后的第三组字符
    • .*代表删除\符号后的任何字符。

更新:在现实世界中,我发现了带有空格、unicode 字符和 ~ 的用户名。所以我替换了 2. 组以包含除符号之外的任何字符\

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