Microsoft asp c# RegEx转义多个保留字符

本文关键字:保留 保留字 字符 转义 asp RegEx Microsoft | 更新日期: 2023-09-27 18:09:53

我只是想使用regex,如果字符串中存在一个不是常规可键入的字符,则返回true/false。这应该是一件容易的事情,不是吗?

我没有pattern, presse,我只是想知道是否存在不在列表中的字符

在正则正则表达式世界中,我只需:

[^0-9a-zA-Z~`!@#$%'^ &*()_-+={'[}]|'':;'"'<,>.?/] // <space> before the ampersand

…我知道这有点臃肿,但这篇文章的重点是…

我发现你不能转义多个保留字符。例如,Regex ex = Regex. escape ("[") + Regex. escape("^")不会命中:"st[eve]或"st^ve"

    string ss = Regex.Escape("[") + Regex.Escape("^");
    Regex rx = new Regex(ss);
    string s = "st^eve";
    rx.IsMatch(s));

    string ss = Regex.Escape("[") + "[0-9]";
    Regex rx = new Regex(ss);
    string s1 = "st^eve"; rx.IsMatch(s1));
    string s2 = "st^ev0e; rx.IsMatch(s2));
    string s3 = "stev0e;  rx.IsMatch(s3));

但是这是唯一不会出错的Microsoft c# Regex转义字符:

    string ss = Regex.Escape("^");
    Regex rx = new Regex(ss);
    string s = "st^eve"; rx.IsMatch(s));

除了对非转义字符的测试外,我是否必须为每个转义必需字符开发单独的测试?

这是其他人正在做的吗?

如果有更好的方法,我愿意接受各种想法。

谢谢您的考虑。

Microsoft asp c# RegEx转义多个保留字符

考虑生成的表达式。您的示例RegEx

string ss = Regex.Escape("[") + Regex.Escape("^");

等价于:

string ss = @"'['^";

也就是说,它不是在寻找[ ^,而是在寻找[ 然后是 ^。所以ste[^ve会匹配。

如果要匹配任何包含一个或多个字符的字符串,则需要添加(非转义的)括号来创建一组字符,例如:

string ss = "[" + Regex.Escape("[") + Regex.Escape("^") + "]"

也就是说,您要求Regex引擎在括号中的字符集中查找一个字符。

首先感谢@PMV。他的输入提示我做了一堆测试。

这显然是它真正的工作原理。

无论我尝试什么,我都不能得到双引号或单引号匹配,除非这两个单独的测试。这实际上是有意义的,一直回到C语言。

注意:在没有的情况下,你使用.Escape()。在我看来,必须使用一个函数来为你创建一个string = "'["是愚蠢的。.Escape() is not necessary on ^ nor { nor ] nor ' nor " nor ' .

    string ss = "[0-9A-Z~`!@#$%^& *()-_+={[}]|'':;<,>.?/";
        // does not match ~ ss = ss + Regex.Escape("'"");
        // does not match ~ ss = ss + Regex.Escape("''");
    ss = ss + "]";
    Regex rx = new Regex(ss);
        // rx = new Regex("[" + Regex.Escape("'"") + "]");
        // works just as well as the line above ~ rx = new Regex("['"]");
        // rx = new Regex("[" + Regex.Escape("'") + "]");
    rx = new Regex("[']");
    string s = "ste've";
    Console.WriteLine("search string {0}", ss);
    Console.WriteLine("IsMatch {0}", rx.IsMatch(s));

就差这么一点了