【问题标题】:trouble with $0 in regex.replace - c#regex.replace 中 $0 的问题 - c#
【发布时间】:2016-12-19 16:49:18
【问题描述】:
string value = "From: $0-$100";
string emailBody = "{From}";
emailBody = Regex.Replace(emailBody, "{From}", value, RegexOptions.IgnoreCase);

我想在 regex.replace 之后获取 emailBody 的值。

预期产出:从:$0-$100

实际输出:来自:{From} - $100

有人可以解释一下是什么原因,我该如何解决这个问题?提前致谢。

【问题讨论】:

    标签: c# asp.net regex


    【解决方案1】:

    在替换模式中使用$$ 替换为1 $: string value = "From: $$0-$$100"

    string value = "From: $$0-$$100";
    string emailBody = "{From}";
    emailBody = Regex.Replace(emailBody, "{From}", value, RegexOptions.IgnoreCase);
    

    模式中的 $0 被替换为整个匹配值,$1 被解析为对 ID=1 的不存在组的反向引用,因此,由于它不存在,文字 $1传递给结果(如您所料)。

    请注意,如果您有一个应该始终被视为文字的动态(用户生成)替换模式,则只需 Replace("$", "$$")

    string value = "From: $0-$100";
    string emailBody = "{From}";
    emailBody = Regex.Replace(emailBody, "{From}", value.Replace("$", "$$"), RegexOptions.IgnoreCase);
    Console.WriteLine(emailBody); // => From: $0-$100
    

    C# online demo

    【讨论】:

    • @ScottChamberlain:不,see this demo 你建议。 Regex.Escape 用于转义 regex 模式,而不是 替换模式
    【解决方案2】:

    如果您只想做一个简单的替换(并且您有用户提供的内容),您可以使用以下表格:

    MyRegex.Replace(userContent, _ => "replacement");
    

    这里我们传递了一个不关心匹配的 lambda,它只是显式地为它们返回固定的替换文本。

    【讨论】:

      【解决方案3】:

      您需要转义 $ 符号,因为它用于替换您的捕获类。我的意思是,0 美元、1 美元 .. 9 美元意味着你正在用你捕获的一个类来替换它。看这里https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx

      You scape them using another $

      string value = "From: $$0-$$100";
      

      编辑:

      关于“0 组” - 0 美元的东西 - 在这里查看 https://stackoverflow.com/a/2248328/4911877

      【讨论】:

      • \$ 对我不起作用。我不得不使用$$,就像wiktor-stribiżew给出的答案中指出的那样。
      • 没错。我不记得尝试过,也许我只是基于其他正则表达式引擎做出了错误假设。我确实更新了答案,谢谢,@burnttoast11
      【解决方案4】:

      您需要转义花括号。

      emailBody = Regex.Replace(emailBody, @"\{From\}", value, RegexOptions.IgnoreCase);
      

      【讨论】:

      • 你要么需要一个逐字字符串 - @"\{From\}" - 要么你需要加倍转义字符 - "\\{From\\}"
      • 不,你不需要转义{,更不用说}了。 .NET 正则表达式引擎足够聪明,可以理解 {} 之间没有数字或逗号分隔的范围不是限制量词,因此可以按字面意思进行解析。请参阅我的答案以获得正确的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      相关资源
      最近更新 更多