2009-12-11 30 views
1

我有一个工作正则表达式扫描一个文本块的数据库中定义的关键字列表。我动态地从数据库创建我正则表达式来得到这样的:c#中保留字符的正则表达式问题

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

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

任何想法如何让这个正则表达式适用于这些特殊情况?我已经尝试过,也没有逃避正则表达式字符串中的特殊字符,但无济于事。

由于提前,

大卫

+1

@是一个正则表达式的特殊字符? – Amarghosh 2009-12-11 10:47:44

+0

您可能首先要避开反斜杠:像'\\ +' – Amarghosh 2009-12-11 10:48:45

+0

好点 - @不是正则表达式的特殊字符。仍然卡住!似乎双逃脱似乎不起作用。任何其他想法? – 2009-12-11 10:54:41

回答

4
new Regex(@"(?<=^|\W)(?:keywords|from|database|with|[email protected]|characters|@ss|[email protected])(?=\W|$)") 

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

编辑:更妙(!感谢艾伦·摩尔 - 两个版本都会产生相同的结果):

new Regex(@"(?<!\w)(?:keywords|from|database|with|[email protected]|characters|@ss|[email protected])(?!\w)") 

两者将无法匹配[email protected]@ass这是你想要大概是什么。

+0

是的,它与@“(\ b | ^)(?:关键词| from | database | with | esc @ ped | characters | @ss | gr @ ss) b“; $)” – asgerhallas 2009-12-11 12:55:51

+0

不,你的正则表达式只在字符串的开头匹配'@ ss' – 2009-12-11 13:00:47

+0

对不起,你是对的,你的回答是正确的。 ) – asgerhallas 2009-12-11 13:02:42

2

当你从数据库中的关键字,创造了正则表达式的字符串之前Regex.Escape逃避它们。

+0

那不可能逃跑@ – asgerhallas 2009-12-11 11:20:40

+0

真的很好打电话asgerhallas。为什么@被排在第一位? – 2009-12-11 11:31:33

+0

我正在逃避似乎是造成问题的人物列表 - 我也尝试过不逃脱他们。 Regex.Escape只能转义保留的元字符 - 但是正则表达式仍然不匹配以@ – 2009-12-11 12:10:56

1

@不表示字边界。

用途:(\ S | ^)(?:关键字|从|数据库|有| ESC @ PED |人物| @ss | GR @ SS)(\ S | $)

具有以下测试程序:

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

给出结果:

@ss

GR @ SS

ESC @ PED

关键字

+0

这样的字符开头的字符串这似乎不起作用。它与“关键字”或“gr @ ss”或“@ss”不匹配。任何其他想法? – 2009-12-11 12:14:50

+0

嗯。我刚刚尝试过。有效。两秒钟,我会再试一次。 – asgerhallas 2009-12-11 12:34:18

+0

对不起,它是:(\\ s | ^)(?:关键字| from | database | with | esc @ ped | characters | @ss | gr @ ss) 更新答案。 – asgerhallas 2009-12-11 12:44:20