1

所以在微软视觉工作室我有一个被编译成正则表达式的字符串。我的字符串是“#(\d+(.\d+)?)=(\d+(.\d+)?)”。我无法编译我的程序,因为我收到一条错误消息,指出 \d 是一个无法识别的转义字符。我如何告诉它闭嘴,让我像专业人士一样进行正则表达式?

4

4 回答 4

1

您还可以使用逐字字符串文字(由于可读性,我更喜欢使用这些文字)。

利用@"(#\d+(.\d+)?)=(\d+(.\d+)?)"

该符号表示字符串在到达结束之前@"不应解释转义字符(以 a 为前缀的字符) 。\"

"注意:您可以通过双引号来匹配搜索模式中的单个""。例如,您可以"Hello"使用模式匹配@"""\w+"""

于 2012-08-21T19:14:07.247 回答
1

以 开头的字符串@,这会导致编译器(几乎)将所有字符单独保留,未转义(例外是",可以转义为""):

@"#(\d+(.\d+)?)=(\d+(.\d+)?"
于 2012-08-21T19:14:31.593 回答
1

问题是c#不喜欢\d里面的字符串。改用逐字字符串

string pattern = @"#(\d+(.\d+)?)=(\d+(.\d+)?)";

“@”表示它。C# 不会在字符串中查找转义序列。如果你必须逃避一个"使用两个""

当然,您可以使用普通字符串。但是你将不得不逃避反斜杠

string pattern = "#(\\d+(.\\d+)?)=(\\d+(.\\d+)?)";
于 2012-08-21T19:14:47.360 回答
1

如果您使用的是普通字符串,则需要转义反斜杠,如下所示:

"#(\\d+(.\\d+)?)=(\\d+(.\\d+)?)"

基本上,您将文字字符串放入 C#;C# 编译器首先看到字符串,并尝试将其解释\d为转义序列(不存在,因此出错)。因此,您使用\\d让 C# 编译器将字符串视为\d,然后将其传递给正则表达式引擎(它确实识别\d为有意义的东西)。(是的,如果你想在你的正则表达式模式中匹配一个文字反斜杠,你需要使用\\\\

但是在 C# 中,您可以选择只在字符串前面加上@以使编译器不理会字符串(尽管"仍然需要转义),所以就像这样:

@"#(\d+(.\d+)?)=(\d+(.\d+)?)"
于 2012-08-21T19:08:51.373 回答