【问题标题】:RegEx.Replace fails with $0.00 in replacement stringRegEx.Replace 失败,替换字符串中包含 $0.00
【发布时间】:2012-01-24 14:54:09
【问题描述】:

我正在尝试使用静态 RegEx.Replace 方法进行简单的替换,如果在替换字符串中我有“$0.00”或它的某种衍生物,它会失败。

代码如下:

void Main()
{
    try
    {           
        string inputString = "[BEGIN-LOOP:DETAILS]this is what I want to replace[END-LOOP:DETAILS]";
        string replacementString = "some text $0.00";   
        inputString = Regex.Replace(inputString, @"(\[BEGIN-LOOP:DETAILS\])(.*?)(\[END-LOOP:DETAILS\])", replacementString, RegexOptions.IgnoreCase | RegexOptions.Singleline);
        Console.WriteLine(inputString);     
    }
    catch (Exception ex)
    {
        throw;
    }
}

失败的正则表达式的输出是:

一些文本 [BEGIN-LOOP:DETAILS]这是我要替换的内容[END-LOOP:DETAILS].00

应该是

一些文字 $0.00

【问题讨论】:

  • 我对正则表达式了解不多,但你必须逃避'$'吗?失败时究竟会发生什么?
  • 我用输出更新了问题

标签: c# regex


【解决方案1】:

您需要按照Substitutions 上的 MSDN 页面上所示转义美元。

$$ 替换在被替换的字符串中插入一个文字“$”字符。

所以你想要:

string replacementString = "some text $$0.00";

顺便说一句,请不要使用这样的 try/catch 块...它会使您的代码混乱无益。

【讨论】:

    【解决方案2】:

    您应该转义 $ 文字,例如:$$。另外,如果你只想替换this is what I want to replace,最好使用正则表达式:

    (?<=\[BEGIN-LOOP:DETAILS\]).*?(?=\[END-LOOP:DETAILS\])
    

    【讨论】:

      【解决方案3】:

      正如 Kirill Polishchuk 已经指出的那样,您应该使用不同的搜索模式。此模式匹配前缀和后缀之间的位置:

      (?<=prefix)find(?=suffix)
      

      应用于您的问题,模式如下所示:

      (?<=\[BEGIN-LOOP:DETAILS]).*?(?=\[END-LOOP:DETAILS])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多