c# - 正则表达式用 \\ 替换问题
问题描述
我创建了自己的正则表达式,除了反斜杠之外一切正常。我尝试了我的版本,但没有一个有帮助。
var regexItem = new Regex("[^A-Za-z0-9_.,&/*:;=+{}()'\"\\ -]+");
string temp2 = "";
while ((@line = file2.ReadLine()) != null)
{
if (regexItem.IsMatch(line) && (line.Contains(".jpg") || line.Contains(".png") || line.Contains(".jpeg") || line.Contains(".svg")))
{
@temp2 = Regex.Replace(line, "[^A-Za-z0-9_.,&/\\*:;=+{}()'\" -]+", "");
postki.WriteLine(@temp2);
Console.WriteLine(@"{0} ==> {1}", @line, @temp2);
}
else
{
postki.WriteLine(@line);
}
}
解决方案
在 c# string literals中,特殊字符(如"
)需要转义。C# 使用\
来转义这些字符。
例如 - 正如你已经做过的那样 - 包含 a 的字符串"
将被声明为:
string quote = "\"";
所以当然反斜杠本身也需要转义。所以一个包含反斜杠的字符串看起来像这样:
string backslash = "\\";
因此,如果文字中有两个反斜杠,则字符串中有一个真正的反斜杠。
但是反斜杠也是正则表达式中的特殊字符(也用于转义其他符号,例如,如果您的意思是文字.
而不是any-character-dot,则使用\.
)。因此,要使用文字反斜杠(意味着匹配搜索字符串中的单个反斜杠),您需要在 c# 字符串文字中使用 4 个反斜杠:
string regexBackSlash = "\\\\";
在您的正则表达式中,您可能的意思是:
var regexItem = new Regex("[^A-Za-z0-9_.,&/*:;=+{}()'\"\\\\ -]+");
// difference here ^
或者您可以使用逐字字符串文字(带有前导@
):
var regexItem = new Regex(@"[^A-Za-z0-9_.,&/*:;=+{}()'""\\ -]+");
(但是你又需要"
用第二个来逃避)。