【问题标题】:How do I escape a backslash in the following regex c#如何在以下正则表达式 c# 中转义反斜杠
【发布时间】:2013-07-31 15:17:04
【问题描述】:

这是我的函数,我正在尝试替换文件中的字符串,但 c# 告诉我我的正则表达式格式错误。有什么想法吗?

public void function(string fileName, string path) {
    string pathToAmmend = @"$SERVERROOT\pathpath";
    string newPath = @"$SERVERROOT\" + path;

    File.WriteAllText(fileName, Regex.Replace(File.ReadAllText(fileName), pathToAmmend, newPath));            
    ....
}

如果我将字符串更改为:

string pathToAmmend = @"$SERVERROOT\\pathpath";
string newPath = @"$SERVERROOT\\" + path;

但是我有两个斜线,我只想要一个斜线。

【问题讨论】:

  • Regex.Escape 答案去哪儿了?它对我有用。
  • 作者删除了它们,可能是因为他们注意到string.Replace在这里是一个更好的解决方案。

标签: c# regex escaping


【解决方案1】:

听起来您实际上根本不需要正则表达式。听起来你很可能只是想要string.Replace

// Split into three statements for clarity.
string input = File.ReadAllText(fileName);
string output = input.Replace(pathToAmend, newPath);
File.WriteAllText(output);

只有在真正尝试匹配模式时才使用正则表达式。

【讨论】:

  • 我正在这样做,但我正在使用 ftpd 客户端应用程序的配置文件,该文件需要我向文件中写入一定数量的字节。出于某种原因,当我将文本写回文件时,使用 File.WriteAllText 它会在文件末尾添加字节,而如果我使用正则表达式,它会覆盖字节并且文件大小保持不变。
  • 你没有在这里比较同类 - 你不能比较 Regex.ReplaceFile.WriteAllText。但是,如果您需要将相同数量的字节写入文件,那么如果替换的文本更小......或更大,那么您想要做什么的问题就出现了。这是一个与是否使用正则表达式完全不同的问题。我认为您混淆了这两个问题。
【解决方案2】:

\ 是正则表达式中的特殊转义字符。您必须对其进行转义,以便将其解释为文字 \ 而不是转义序列。 $ 也是一个特殊字符(end anchor),因此您也需要转义它。

string pathToAmmend = @"\$SERVERROOT\\pathpath";

使用 @ 创建逐字字符串仅意味着您不必为了 C# 编译器而转义 \。您仍然可以在正则表达式模式中转义 \ for。如果没有逐字字符串,这将是:

string pathToAmmend = "\\$SERVERROOT\\\\pathpath";

当然,作为Jon Skeet points out,对于这种简单的事情,正则表达式并不是最好的方法。

【讨论】:

  • 这个字符串给了我 \$SERVERROOT\\pathpath 的结果,我想要 $SERVERROOT\pathpath
  • @DavidFolksman newPath 变量不必像这样特别转义,因为它不是正则表达式模式。
  • 就个人而言,我更喜欢Regex.Escape,而不是手动处理此类问题。
猜你喜欢
  • 1970-01-01
  • 2012-02-25
  • 2016-01-16
  • 2011-08-29
  • 1970-01-01
  • 2011-04-30
相关资源
最近更新 更多