我怎么把正则表达式搞砸了

本文关键字:正则表达式 | 更新日期: 2023-09-27 18:10:11

我真的很困惑。我用c#写了一段代码,它传递了一个可能的文件路径。如果它包含一个在正则表达式字符串中指定的字符,它应该返回false。然而,regex函数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"

我做错了什么/误解与正则表达式,或者它是其他的东西,而不是我搞砸了正则表达式?

我怎么把正则表达式搞砸了

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

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

您要求路径以这些字符之一开头。通过去掉这个约束,它将在整个字符串中搜索这些字符。

但是为什么不使用框架来为你做这些工作呢?

Check this out:检查字符串是否为有效的Windows目录(文件夹)路径

不使用正则表达式,您可以这样做:

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));
}

有人已经指出了将您的匹配锚定到第一个字符的插入符号。但还有一个你可能还没有意识到的错误。这一点与您使用字符串字面值有关。你现在得到的是一个传统的c风格字符串:

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

…它变成了这个regex:

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

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

然而,正则表达式不会检测到您想要的反斜杠。为此,在正则表达式中需要两个反斜杠,因此在字符串文本中应该有四个反斜杠:

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

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

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

必须转义/文字

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

插入符号表示字符组的否定。从spTest中删除它可以解决这个问题。

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