我有一个正在运行的正则表达式,它扫描一大块文本以查找db中定义的关键字列表。我从db动态创建我的正则表达式来获取:
\b(?:keywords|from|database|with|esc\@ped|characters|\@ss|gr\@ss)\b
请注意特殊字符是转义的。这适用于绝大多数情况,除了关键字的第一个字符是@或$等正则表达式特殊字符。所以在上面的例子中,@ s将不匹配,但gr @ ss和esc @ ped将会匹配。
如何让这个正则表达式适用于这些特殊情况?我已尝试使用和不使用正则表达式字符串中的特殊字符,但无济于事。
提前致谢,
大卫
答案 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
关键字