【问题标题】:Regex expression "\\u002E[^\x5C]*$" not working in C#正则表达式“\\u002E[^\x5C]*$”在 C# 中不起作用
【发布时间】:2019-10-05 03:55:08
【问题描述】:

我正在使用 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 .\,常规 .\,前面带有转义字符,将字符串分成多个部分,并将 [] 替换为 @ 987654327@。似乎没有任何效果,我不断收到同样的错误。

【问题讨论】:

  • 要么转义反斜杠,例如"\\u002E[^\x5C]*$" 或使用文字运算符@,例如@"\u002E[^\x5C]*$"
  • @RamblinRose:他需要转义两个反斜杠,而不仅仅是第一个反斜杠。
  • @BenVoigt 确实,好眼睛。

标签: c# regex directory filepath


【解决方案1】:

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

【讨论】:

  • @成功了!非常感谢,这一直困扰着我一整天!
  • 很高兴为您提供帮助!作为快速说明,您可以通过点击旁边的复选标记将问题的答案标记为“已接受”。这表示原始问题已根据您的喜好得到解决。
  • 太棒了,刚刚检查了你的答案。希望这也能帮助其他人。
【解决方案2】:

这个字符串:

"\u002E[^\x5C]*$"

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

".[^\]*$"

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

你的逃跑尝试:

"\\u002E[^\x5C]*$"

生成了这个字符串

"\u002E[^\]*$"

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

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

"\\u002E[^\\x5C]*$"

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

C:/Users/.default/.profile/

是目录的有效名称。

最后,不是模式匹配名称,为什么不直接查看用户输入的确切名称是否存在以及它是目录还是文件?因为这也可以是目录的名称:

C:\Users\.default\.profile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 2020-07-08
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多