我怎么把正则表达式搞砸了
本文关键字:正则表达式 | 更新日期: 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 = "[~#%&*''{}+<>/'"|]";