【问题标题】:Remove dynamic username from file path从文件路径中删除动态用户名
【发布时间】:2012-12-20 07:42:32
【问题描述】:

我在 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 之类的内容。

【问题讨论】:

  • 只需 split('\') 并从数组中删除第二项,完成。
  • 这比使用正则表达式还要糟糕...
  • fileName = fileName.Replace(@"\username", ""); 会这样做,但为什么你需要使用正则表达式?
  • 抱歉,用户名也是动态的 - 可能是 john 或 larry 或 bob 或其他任何名称。我真的需要使用正则表达式 - 我知道,这有点矫枉过正,但没关系。
  • @Raymond,你一直说你需要使用正则表达式。这是为什么?这似乎是一个奇怪的要求。

标签: c# regex filepath


【解决方案1】:

你可以试试这个示例:

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

【讨论】:

  • 如何调整它以忽略文件名前面的单词? string filename = @"这个文件 X:\Users\username\foo.txt 是文本。"我想忽略“这个文件”,虽然这只是一个例子。谢谢!
  • @Raymond Parsons 更新了答案
  • 谢谢...我通过一些研究找到了答案。真的很感激。
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2014-03-16
  • 2011-11-27
相关资源
最近更新 更多