C# 即使我尝试过转义所有内容,C也无法将正则表达式识别为字符串

C# 即使我尝试过转义所有内容,C也无法将正则表达式识别为字符串,c#,.net,regex,C#,.net,Regex,我正在使用C,希望在我的代码中使用以下正则表达式: sDatabaseServer\s*=\s*"([^"]*)" 我已将其放在我的代码中,作为: Regex databaseServer = new Regex(@"sDatabaseServer\s*=\s*"([^"]*)"", RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace); 我知道必须对字符串引号内的所有括号和引号进行转义,但由于某些原因,以下操作仍然不起作

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

sDatabaseServer\s*=\s*"([^"]*)"
我已将其放在我的代码中,作为:

Regex databaseServer = new Regex(@"sDatabaseServer\s*=\s*"([^"]*)"", RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);
我知道必须对字符串引号内的所有括号和引号进行转义,但由于某些原因,以下操作仍然不起作用:

工作版本:

有没有办法让C把我的正则表达式看作一个字符串?我知道我知道…简单的问题…对不起,我还是个业余爱好者


谢谢你们

你跳过括号时走得太远了一步。如果您希望它们是正则表达式元字符,即捕获组,则不能转义它们。否则,它们将匹配文字括号

因此,这可能是您正在寻找的:

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

当你跳过括号时,你走得太远了。如果您希望它们是正则表达式元字符,即捕获组,则不能转义它们。否则,它们将匹配文字括号

因此,这可能是您正在寻找的:

@"sDatabaseServer\s*=\s*""([^""]*)"""
在第一次尝试中,您忘记了转义您的引用。但由于它是一个字符串文本,使用\进行转义不起作用

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

在第一次尝试中,您忘记了转义您的引用。但由于它是一个字符串文本,使用\进行转义不起作用


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

使用\x22而不是引号:

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

Ignorepattern空格允许在正则表达式模式中添加注释,可以将符号或模式拆分为多行。你也没有;移除

更好的模式是

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

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

使用\x22而不是引号:

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

Ignorepattern空格允许在正则表达式模式中添加注释,可以将符号或模式拆分为多行。你也没有;移除

更好的模式是

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

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

,所以我尝试使用上面的正则表达式,但出于某种原因,VisualStudio显示了上面第二个引号后面的括号,而不是字符串的一部分,即使我在它前面转义了双引号。@practicalsyde然后尝试一下。它相当于您给定的正则表达式。您是否尝试将该代码放入编辑器中?您不能同时转义字符和使用@LiteralThank m.buttner。这正是我所需要的。@practicalsyde只是一个旁白,它解释了为什么你永远不应该对正则表达式使用非逐字字符串:如果你想匹配文本$,正则表达式需要你写\$。但是如果你把它放在一个普通的字符串中,那么C编译器会把它当作一个转义的$,所以保存的字符串永远不会包含反斜杠。因此,您需要编写\\$,这会变得非常烦人,尤其是因为引号只需转义一次。因此:尽可能地使用逐字字符串,其中通过将引号加倍来转义引号,因此我可能会尝试使用上述正则表达式,但由于某些原因,VisualStudio会将上面第二个引号后面的括号显示为不属于字符串的一部分,即使我在它前面转义了双引号。@practicalsyde然后尝试一下。它相当于您给定的正则表达式。您是否尝试将该代码放入编辑器中?您不能同时转义字符和使用@LiteralThank m.buttner。这正是我所需要的。@practicalsyde只是一个旁白,它解释了为什么你永远不应该对正则表达式使用非逐字字符串:如果你想匹配文本$,正则表达式需要你写\$。但是如果你把它放在一个普通的字符串中,那么C编译器会把它当作一个转义的$,所以保存的字符串永远不会包含反斜杠。因此,您需要编写\\$,这会变得非常烦人,尤其是因为引号只需转义一次。因此:尽可能使用逐字字符串,通过将引号加倍来转义引号。由于OP使用的是逐字逐句字符串,因此不需要双重转义。问题就在括号里。不。由于OP使用的是逐字逐句字符串,因此不需要双重转义。问题是括号。这可能是一个品味问题,但是\x22如何提高可读性?@m.buettner我不一定要寻找可读性,我希望不必为C解析器和regex解析器争a。为此,\x22使预先使用C解析器变得更容易。这可能是一个品味问题,但是\x22如何提高可读性?@m.buettner我不需要
Sariy在寻找可读性时,我希望不必为C解析器和正则表达式解析器争a。为此\x22使预先使用C解析器更容易。单击答案旁边的复选标记将问题标记为已解决;您不需要更改标题或问题。仅供参考,IgnorePatternWhitespace选项对您没有任何帮助,因为模式中没有空格,而编译选项可能弊大于利,从性能角度看@阿兰摩尔,谢谢你提供的信息。我将删除它们。单击答案旁边的复选标记将问题标记为已解决;您不需要更改标题或问题。仅供参考,IgnorePatternWhitespace选项对您没有任何帮助,因为模式中没有空格,而编译选项可能弊大于利,从性能角度看@阿兰摩尔,谢谢你提供的信息。我会把那些拿走。