【问题标题】:How have I screwed up my regex?我怎么搞砸了我的正则表达式?
【发布时间】:2015-11-22 07:10:20
【问题描述】:

我在这里真的很困惑。我在 C# 中编写了一个 sn-p 代码,它传递了一个可能的文件路径。如果它包含在正则表达式字符串中指定的字符,它应该返回 false。但是,正则表达式函数 Match 拒绝找到任何匹配的内容(我什至将其设置为我知道在字符串中的单个字符),这让我非常恼火。 代码是:

static bool letterTest(string pathway)
{
    bool validPath = false;
    char[] c = Path.GetInvalidPathChars();
    string test = new string(c);
    string regex = "["+test+"]";
    string spTest = "^[~#%&*\\{}+<>/\"|]";

    Match match = Regex.Match(pathway, spTest);

    if (!match.Success)
    {
        validPath = true;
    }

    return validPath;
}

我传递给它的字符串是:@"C:/testing/invalid#symbol"

我对正则表达式做错了什么/误解了,还是我搞砸了正则表达式以外的东西?

【问题讨论】:

  • 这不是正则表达式的问题,只需使用string.Contains()
  • @Jonesopolis 测试子字符串,但 pathway.Any(c =&gt; Path.GetInvalidPathChars().Contains(c)) 可以工作。
  • 如果您打算使用正则表达式,您应该尝试使用string regex = "["+Regex.Escape(test)+"]";。由于您获得了无法在文件夹路径中使用的符号数组,并且它们包含特殊的正则表达式元字符,因此这是处理该问题的最安全方法。但是,在这里,您需要使用某些人提供的 LINQ。
  • 如果你要使用你自己的无效字符,如图所示,告诉你不需要插入符号(你想要在类中找到那些)。但是,正则表达式没有正确字符串为双引号字符串。应该是string regex = "[~#%&amp;*\\\\{}+&lt;&gt;/\"|]";

标签: c# regex


【解决方案1】:

从您的正则表达式中删除初始插入符号:

[~#%&*\\{}+<>/\"|]

您要求路径以其中一个字符开头。通过删除该约束,它将在整个字符串中搜索任何这些字符。

但为什么不使用框架为您完成工作呢?

看看这个:Check if a string is a valid Windows directory (folder) path

【讨论】:

  • 啊,谢谢,我确实误解了插入符号的用途。
【解决方案2】:

您必须转义 / 文字

"^[~#%&*\\{}+<>\/\"|]"

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
  • 这是错误的。正斜杠在正则表达式中没有特殊含义。你只需要在它被用作正则表达式 delimiter 时对其进行转义,这在 C# 中不是问题。
【解决方案3】:

Caret 代表字符组的否定。从 spTest 中删除它可以解决这个问题。

 string spTest = "[~#%&*\\{}+<>/\"|]";

【讨论】:

  • 插入符号仅用于在字符类内部进行否定。他是字符串开头的锚。
【解决方案4】:

您可以执行以下操作,而不是正则表达式。

static bool letterTest(string pathway)
{
    char[] badChars = Path.GetInvalidPathChars();
    return pathway.All(c => !badChars.Contains(c));
    // or
    // return !pathway.Any(c => badChars.Contains(c));
    // or
    // return badChars.All(bc => !pathway.Contains(bc));
    // or
    // return !badChars.Any(bc => pathway.Contains(bc));
}

【讨论】:

    【解决方案5】:

    有人已经指出了将匹配项锚定到第一个字符的插入符号。但是还有一个你可能还不知道的错误。这与您使用字符串文字有关。你现在拥有的是一个传统的 C 风格的字符串文字:

    "[~#%&*\\{}+<>/\"|]"
    

    ...变成这个正则表达式:

    [~#%&*\{}+<>/"|]
    

    双反斜杠变成了单反斜杠,它被视为后面大括号 (\{) 的转义。大括号不需要在字符类中转义,但它不被视为语法错误。

    但是,正则表达式不会按您的预期检测反斜杠。为此,您需要在正则表达式中使用 两个 反斜杠,因此字符串文字中应该有 四个 反斜杠:

    "[~#%&*\\\\{}+<>/\"|]"
    

    或者,您可以使用 C# 逐字字符串文字。反斜杠在逐字字符串中没有特殊含义。唯一需要特殊处理的是引号,您可以通过添加另一个引号来转义:

    @"[~#%&*\\{}+<>/""|]"
    

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      相关资源
      最近更新 更多