c#中保留字符的正则表达式问题

时间:2009-12-11 10:35:38

标签: c# regex

我有一个正在运行的正则表达式,它扫描一大块文本以查找db中定义的关键字列表。我从db动态创建我的正则表达式来获取:

\b(?:keywords|from|database|with|esc\@ped|characters|\@ss|gr\@ss)\b

请注意特殊字符是转义的。这适用于绝大多数情况,除了关键字的第一个字符是@或$等正则表达式特殊字符。所以在上面的例子中,@ s将不匹配,但gr @ ss和esc @ ped将会匹配。

如何让这个正则表达式适用于这些特殊情况?我已尝试使用和不使用正则表达式字符串中的特殊字符,但无济于事。

提前致谢,

大卫

3 个答案:

答案 0 :(得分:4)

new Regex(@"(?<=^|\W)(?:keywords|from|database|with|esc@ped|characters|@ss|gr@ss)(?=\W|$)")

会匹配。它检查在匹配关键字之前/之后是否存在非单词字符(或字符串的开头/结尾)。由于标点符号和其他可能构成单词边界的非单词字符,我选择了\W而不是\s

编辑:更好(感谢Alan Moore! - 两个版本都会产生相同的结果):

new Regex(@"(?<!\w)(?:keywords|from|database|with|esc@ped|characters|@ss|gr@ss)(?!\w)")

两者都无法与@ass中的l@ss匹配,这可能是您想要的。

答案 1 :(得分:2)

从数据库中获取关键字后,在创建Regex字符串之前使用Regex.Escape对其进行转义。

答案 2 :(得分:1)

@不表示单词边界。

使用:(\ s | ^)(?: keywords | from | database | with | esc @ ped | characters | @ss | gr @ss)(\ s | $)

使用以下程序测试:

    static void Main(string[] args)
    {
        string pattern = "(\\s|^)(?:keywords|from|database|with|esc@ped|characters|@ss|gr@ss)(\\s|$)"
        var matches = Regex.Matches("@ss is gr@ss is esc@ped keywordsnospace keywords", pattern);
        foreach (Match match in matches)
        {
            Console.WriteLine(match.Groups[2]);
        }
    }

给出结果:

@ss

GR @ SS

ESC @ PED

关键字