正则表达式“\\u002E[^\x5C]*$”在 C# 中不起作用

Regex expression "\\u002E[^\x5C]*$" not working in C#

我正在使用 C# 开发一个允许手动输入目录路径的 WPF 程序。我的用户不是经验丰富的计算机用户,可能会输入文件路径而不是目录路径。

我已经创建了一个正则表达式,它可以完全按照我想要的方式在 RegExr 网站上运行,但在我的 C# 代码中却失败了。只要用户输入的路径末尾出现文件扩展名,它就会触发。表达式如下:

\x2e[^\x5c]*$

我试过在

中使用它
using System;
using System.Text.RegularExpressions;
using System.Windows;

public partial class MainWindow : Window
{
    private void ConvertFile(object sender, RoutedEventArgs e)
    {
        Regex rx = new Regex("\u002E[^\x5C]*$");
    }
}

我希望函数按预期工作,但我收到以下错误:

System.ArgumentException: 'parsing ".[^]*$" - Unterminated [] set.'

据我所知,这组括号似乎已终止,我看不出有什么问题,但它仍然不起作用。我尝试添加和删除额外的反斜杠,使用 Unicode .\,常规 .\ 在它们之前使用转义字符,将字符串分成多个部分,并将 [] 替换为 ()。似乎没有任何效果,而且我不断收到同样的错误。

尝试Regex rx = new Regex(@"\u002E[^\x5C]*$");。字符串前的 @ 告诉系统按字面解释每个字符。如果有任何字符您想使用 C# 的转义序列(而不是那些特定于正则表达式的字符!),您应该能够将字符串拆分为多个并将其与 +.

连接起来

这个字符串:

"\u002E[^\x5C]*$"

被编译器转换成这个字符串:

".[^\]*$"

转义码由编译器处理,而不是正则表达式引擎。

你的逃跑尝试:

"\u002E[^\x5C]*$"

生成了这个字符串

"\u002E[^\]*$"

这仍然允许正则表达式引擎看到 \](转义反斜杠)而不是由反斜杠组成的否定字符 class。

禁用带有 @ 前缀的转义码的编译器解释将起作用,转义 每个 反斜杠也是如此:

"\u002E[^\x5C]*$"

我可以提醒您 Windows 也将正斜杠视为有效的目录分隔符,例如

C:/Users/.default/.profile/

是目录的有效名称。

最后,与其对名称进行模式匹配,不如直接看用户输入的确切名称是否存在,是目录还是文件?因为这也可以是目录的名称:

C:\Users\.default\.profile