我在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.Replace
或String.Join
等内容不支持。
答案 0 :(得分:0)
您可以尝试以下示例:
string fileName = @"X:\Users\username\AppData\Local\foo.txt";
Console.Write(Regex.Replace(fileName, @"([A-Z]{1}\:*\\Users\\)(\w+\\)(.*)", "$1$3"));
说明:
([A-Z]{1}\:\\[Uu]sers\\)
- 正则表达式的这一部分是第一组字符,在username
之前,在路径中
^
代表行的开头(删除此项以忽略文件名前的字词) [A-Z]{1}\:\\
代表磁盘根路径。您可以选择要在此处的磁盘字母,如下所示:[CDX-Z]{1}
。注意{1}
- 这是约束意味着您只需要1个大写字母。[Uu]sers\\
代表用户目录名称,请注意不区分大小写的用户路径的组
这是第一组,在替换模式中称为$1
(\w+\\)
- 正则表达式的这一部分是路径中的第二组字符username
\w+\\
代表至少一个字符和\
符号。
这是第二组,不是替换模式(.*)
- 正则表达式的这一部分是username
之后的第三组字符,位于路径中
.*
代表删除\
符号后的任何字符。更新:
在现实世界中,我发现用户名包含空格,unicode字符和〜。所以我将2.组替换为包含\
符号的任何字符。
string fileName = @"X:\Users\username\AppData\Local\foo.txt";
Console.Write(Regex.Replace(fileName, @"([A-Z]{1}\:\\[Uu]sers\\)([^\\]*\\)(.*)", "$1$3"));