【问题标题】:C# dollar problem with regex-replace正则表达式替换的 C# 美元问题
【发布时间】:2010-12-02 18:29:13
【问题描述】:

我想在两个命名捕获组之间的特定位置插入一个美元符号。问题是这意味着替换字符串中紧随其后的两个美元符号会导致问题。

我怎样才能用 Replace 方法直接做到这一点?我只是通过添加一些我立即再次删除的临时垃圾找到了解决方法。

查看问题代码:

      // We want to add a dollar sign before a number and use named groups for capturing;
      // varying parts of the strings are in brackets []
      // [somebody] has [some-dollar-amount] in his [something]

      string joeHas = "Joe has 500 in his wallet.";
      string jackHas = "Jack has 500 in his pocket.";
      string jimHas = "Jim has 740 in his bag.";
      string jasonHas = "Jason has 900 in his car.";

      Regex dollarInsertion = new Regex(@"(?<start>^.*? has )(?<end>\d+ in his .*?$)", RegexOptions.Multiline);

      Console.WriteLine(joeHas);
      Console.WriteLine(jackHas);
      Console.WriteLine(jimHas); 
      Console.WriteLine(jasonHas);
      Console.WriteLine("--------------------------");

      joeHas = dollarInsertion.Replace(joeHas, @"${start}$${end}");
      jackHas = dollarInsertion.Replace(jackHas, @"${start}$-${end}");          
      jimHas = dollarInsertion.Replace(jimHas, @"${start}\$${end}");
      jasonHas = dollarInsertion.Replace(jasonHas, @"${start}$kkkkkk----kkkk${end}").Replace("kkkkkk----kkkk", "");

      Console.WriteLine(joeHas);
      Console.WriteLine(jackHas);
      Console.WriteLine(jimHas);
      Console.WriteLine(jasonHas);




Output:
Joe has 500 in his wallet.
Jack has 500 in his pocket.
Jim has 740 in his bag.
Jason has 900 in his car.
--------------------------
Joe has ${end}
Jack has $-500 in his pocket.
Jim has \${end}
Jason has $900 in his car.

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    使用这个替换模式:"${start}$$${end}"

    双精度 $$ 转义 $ 以便将其视为文字字符。第三个$ 确实是命名组${end} 的一部分。您可以在 MSDN Substitutions page 上阅读相关内容。

    我会坚持上述方法。或者,您可以使用接受 MatchEvaluatorReplace 重载并连接您需要的内容,类似于以下内容:

    jackHas = dollarInsertion.Replace(jackHas,
                  m => m.Groups["start"].Value + "$" + m.Groups["end"].Value);
    

    【讨论】:

      【解决方案2】:

      你为什么首先使用正则表达式?

      string name = "Joe";
      int amount = 500;
      string place = "car";
      
      string output = string.Format("{0} has ${1} in his {2}",name,amount,place);
      

      【讨论】:

      • 大概 OP 需要从字符串中提取该信息。它不是现成的。
      • 就像艾哈迈德所说的那样。我给出的例子只是为了描绘替换问题和真实的字符串,而它的真正用途不是简单的句子。
      • 这很公平。但是,如果您只是替换令牌,则正则表达式是多余的,并且比替代方法慢。 (RegEx 并不慢,但它无法匹配普通 .Replace() 的速度/简单性)
      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多