L1ckt0r Asked:2020-09-21 23:33:04 +0800 CST2020-09-21 23:33:04 +0800 CST 2020-09-21 23:33:04 +0800 CST C#正则表达式问题 772 我有一个表情"\"" + ".*?[^\\]" + "\""。它在 regex101.com 上运行良好,但是在 VS 中编译时会出现错误,即 charset is not closed []。由于 before 没有]关闭\。而且我不知道如何解决它。请帮帮我! c# 1 个回答 Voted Best Answer Wiktor Stribiżew 2020-09-21T23:36:10+08:002020-09-21T23:36:10+08:00 在您的代码中,这"[^\\]"是 text [^\],它不是有效的字符类,因为最后的大括号被转义,因此字符类没有正确关闭。 实际上,在双引号之间搜索文本不是一个有效的表达式,在双引号之间可以有转义序列。 不要忘记在普通字符串文字给出的正则表达式中使用 4 个反斜杠来搜索一个字符\(然后您需要用 转义双引号\)(即字符串文字"\"\\\\"是 text "\\),以及\“逐字”字符串文字中的2 个字符(用另一个双引号(即@"""\\"= "\\)转义双引号。 利用 var rx = new Regex(@"""[^\\""]*(?:\\.[^\\""]*)*""", RegexOptions.Singleline); 更妙的是, var rx = new Regex(@"(?<=(?<!\\)(?:\\{2})*)""[^\\""]*(?:\\.[^\\""]*)*""", RegexOptions.Singleline); 查看表达式如何工作的示例。 在 C# 中使用两种不同类型的文字定义模板的示例: Console.WriteLine(@"(?<=(?<!\\)(?:\\{2})*)""[^\\""]*(?:\\.[^\\""]*)*"""); Console.WriteLine("(?<=(?<!\\\\)(?:\\\\{2})*)\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\""); // => (?<=(?<!\\)(?:\\{2})*)"[^\\"]*(?:\\.[^\\"]*)*"
在您的代码中,这
"[^\\]"
是 text[^\]
,它不是有效的字符类,因为最后的大括号被转义,因此字符类没有正确关闭。实际上,在双引号之间搜索文本不是一个有效的表达式,在双引号之间可以有转义序列。
不要忘记在普通字符串文字给出的正则表达式中使用 4 个反斜杠来搜索一个字符
\
(然后您需要用 转义双引号\
)(即字符串文字"\"\\\\"
是 text"\\
),以及\
“逐字”字符串文字中的2 个字符(用另一个双引号(即@"""\\"
="\\
)转义双引号。利用
更妙的是,
查看表达式如何工作的示例。
在 C# 中使用两种不同类型的文字定义模板的示例: