首页 > 解决方案 > 正则表达式用 \\ 替换问题

问题描述

我创建了自己的正则表达式,除了反斜杠之外一切正常。我尝试了我的版本,但没有一个有帮助。

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#.netregex

解决方案


在 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_.,&/*:;=+{}()'""\\ -]+");

(但是你又需要"用第二个来逃避)。


推荐阅读