1

我使用 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# 的业余爱好者...

已解决:谢谢各位!

4

3 回答 3

5

当你逃脱括号时,你走得太远了。如果您希望它们成为正则表达式元字符(即捕获组),那么您不能对它们进行转义。否则,它们将匹配文字括号。

所以这可能是你正在寻找的:

@"sDatabaseServer\s*=\s*""([^""]*)"""
于 2012-11-09T19:55:48.070 回答
1
string regex = "sDatabaseServer\\s*=\\s*\"([^\"]*)\""

在您的第一次尝试中,您忘记了转义您的报价。但是因为它是一个字符串文字,所以用 a 转义是\行不通的。

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

于 2012-11-09T19:56:37.540 回答
0

使用 \x22 而不是引号:

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

Ignorepattern whitespace 允许在正则表达式模式(# 符号)或分割成多行的模式中进行注释。你也没有;消除。

你所寻求的更好的模式是

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

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

于 2012-11-09T20:00:41.473 回答