代码之家  ›  专栏  ›  技术社区  ›  David Conlisk

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

  •  1
  • David Conlisk  · 技术社区  · 15 年前

    我有一个正在工作的正则表达式,它扫描文本块,查找数据库中定义的关键字列表。我从db动态创建我的正则表达式,以获得以下结果:

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

    请注意,特殊字符被转义。这适用于绝大多数情况,除非关键字的第一个字符是正则表达式特殊字符,如@或$。因此,在上面的示例中,@ss将不匹配,但gr@ss及esc@ped威尔。

    提前感谢,,

    大卫

    3 回复  |  直到 15 年前
        1
  •  4
  •   Tim Pietzcker    15 年前
    new Regex(@"(?<=^|\W)(?:keywords|from|database|with|esc@ped|characters|@ss|gr@ss)(?=\W|$)")
    

    会匹配的。它检查要匹配的关键字前后是否有非单词字符(或字符串的开头/结尾)。我选择了 \W \s 因为标点符号和其他可能构成单词边界的非单词字符。

    更好(多亏了艾伦·摩尔!)两个版本将产生相同的结果):

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

    两者都不匹配 @ass l@ss 这可能就是你想要的。

        2
  •  2
  •   Hasani Blackwell    15 年前

    当您从数据库中获取关键字时,使用 Regex.Escape

        3
  •  1
  •   asgerhallas    15 年前

    @不表示单词边界。

    使用:(\s |^)(?:关键字|来自|数据库|带有|esc@ped|字符|@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]);
            }
        }
    

    给出结果:

    @党卫军

    esc@ped