【问题标题】:Regex with a backslash as a pattern terminator带有反斜杠作为模式终止符的正则表达式
【发布时间】:2015-03-26 02:41:03
【问题描述】:

我试图让JJ01G3C5-10A6S0 离开:

\\JJ01G3C5-10A6S0\C$\2015\Mar\24\

Regex reg = new Regex("[^\\\\].+\\");

注意:我不能假设该值会专门采用这种格式,所以我终止字符串的唯一方法是假设它以双反斜杠 \\ 开头,然后是一些数据......然后以一个结尾反斜杠 \

但是这让我很失望:

未处理的异常:System.ArgumentException:解析"[^\\].+\" - 模式末尾的非法\

有没有办法将反斜杠作为正则表达式终止符?

【问题讨论】:

  • 您可能希望使用逐字字符串,方法是在它们前面加上一个@ 符号,这样您就不必进行双重分隔。
  • 另一种方法...@"\\JJ01G3C5-10A6S0\C$\2015\Mar\24\".Split('\\')[2]
  • @DLeh 我认为您希望该项目作为索引 2,而不是 3。
  • @juharr 是的,谢谢

标签: c# .net regex


【解决方案1】:

假设它是一个 unc 路径的替代方案:

string unc_server_name = new Uri(@"\\JJ01G3C5-10A6S0\C$\2015\Mar\24\").Host;

【讨论】:

    【解决方案2】:

    在编写正则表达式时,最好使用verbatim string literals,即在双引号字符串前加上@。这可以防止编译器将反斜杠视为转义字符。如果没有 @,您需要将所有反斜杠加倍。

    您也不需要使用方括号。这些是用于字符类的。

    Regex reg = new Regex("^\\\\\\\\.+\\\\");
    

    或等效(更容易理解)

    Regex reg = new Regex(@"^\\\\.+?\\");
    

    这会解析为:

    • ^ 行首
    • \\ 表示字面反斜杠
    • \\ 表示另一个字面反斜杠
    • .+? 表示任何字符中的一个以上
    • \\ 表示另一个字面反斜杠

    +? 表示法表示它是非贪婪的,它匹配尽可能少的字符以使整个事物匹配。否则它将尝试匹配所有内容。

    【讨论】:

    • 您对正则表达式部分的解释与正则表达式不匹配。具体来说,$ 不是行的开头^ 是(正如您在正则表达式中所拥有的那样)并且您没有在正则表达式中使用.+?
    • 你在说什么?我的正则表达式中没有一个 $,OP 的正则表达式也没有。
    • 我刚刚解决了这个问题。现在我可以投票给真正回答问题的第一个答案。
    • 谢谢@AlanMoore 我不知道我的示例正则表达式是如何变得如此扭曲的。
    • 但是还有一个问题。 OP 正在尝试提取没有反斜杠的文本,因此您需要捕获 .+? 并展示如何检索该部分。
    【解决方案3】:

    你可以使用这个正则表达式:

    Regex regex = new Regex(@"(?<=\\\\)[^\\]*(?=\\)");
    

    RegEx Demo

    【讨论】:

    • 谢谢!这很好用!我决定使用更通用的 Uri 主机解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2015-01-24
    • 2020-07-23
    • 2010-11-01
    • 2011-09-22
    • 1970-01-01
    相关资源
    最近更新 更多