即使我试图逃避一切,C#也不会将我的正则表达式识别为字符串

时间:2012-11-09 19:52:58

标签: c# .net regex

我正在使用C#并希望在我的代码中使用以下正则表达式:

sDatabaseServer\s*=\s*"([^"]*)"

我把它放在我的代码中:

Regex databaseServer = new Regex(@"sDatabaseServer\s*=\s*"([^"]*)"", RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);

我知道你必须在字符串引号内转义所有括号和引号,但由于某种原因,以下内容仍然不起作用:

工作版本:

Regex databaseServer = new Regex(@"sDatabaseServer\s*=\s*""([^""]*)""", RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);

任何想法如何让C#看到我的正则表达式只是一个字符串?我知道我知道....简单的问题...对不起我仍然是一个业余的C#...

已解决:谢谢你们!

3 个答案:

答案 0 :(得分:5)

当你逃脱括号时,你走得太远了。如果您希望它们是正则表达式元字符(即捕获组),那么您不能逃避它们。否则它们将匹配字面括号。

所以这可能就是你要找的东西:

@"sDatabaseServer\s*=\s*""([^""]*)"""

答案 1 :(得分:1)

string regex = "sDatabaseServer\\s*=\\s*\"([^\"]*)\""
在你的第一次尝试中,你忘了逃避你的报价。但由于它是一个字符串文字,因此使用\进行转义不起作用。

在我们的第二次尝试中,您转义了引号,但是您没有逃脱空白令牌所需的\ \s

答案 2 :(得分:0)

使用\ x22而不是引号:

string pattern = @"sDatabaseServer\s*=\s*\x22([^\x22]*)\x22";

但是

Ignorepattern空格允许在正则表达式模式中使用注释(#符号)或在多行上分割模式。你没有;除去。

您寻求的更好的模式是

string pattern =@"(?:sDatabaseServer\s*=\s*\x22)([^\x22]+)(?:\x22)";

(?:)匹配但不捕获并且像解析器的锚一样。此外,它假设引号中至少有1个字符,因此使用+而不是*。