使用正则表达式查找并替换字符串中的数字

时间:2012-09-14 21:29:48

标签: c# regex

我想要实现的是使用从(match * int)计算的新值替换字符串中的数字。

所以字符串输入如下:

500g Flour
14g Salt
7g Dry yeast
45ml Olive oil
309ml Water

结果应如下所示:

1000g Flour
28g Salt
14g Dry yeast
90ml Olive oil
618 ml Water

row["ingredients"]DataRow

这就是我所在的地方:

System.Text.RegularExpressions.
        Regex.Replace(row["ingredients"].ToString(), 
                      @"[^/d]", Delegate(Match match) { return match * 2; },
                      RegexOptions.Multiline);

非常感谢任何解决方案。

4 个答案:

答案 0 :(得分:4)

第一个问题是你的正则表达式只匹配不是数字的字符。

更正:它使用正斜杠而不是反斜杠,所以它匹配任何不是斜杠或d

的东西

将正则表达式更改为@"\b(\d+)"

以下是dotnetfiddle.net

的工作示例
using System;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var string1 = "500g Flour 14g Salt 7g Dry yeast 45ml Olive oil 309ml Water";

            var result = Regex.Replace(string1, @"\b(\d+)", Doubler, RegexOptions.Multiline);

            Console.WriteLine(result);

            Console.ReadKey();
        }

        private static string Doubler(Match match)
        {
            return (Convert.ToInt32(match.Value)*2).ToString();
        }
    }
}

答案 1 :(得分:1)

[^/d]表示“除斜杠或字母d之外的任何字符”。

要匹配数字,请使用\d+

答案 2 :(得分:0)

将不同类型的数据保存到datarow不是好习惯。 在你的样本中: “500g面粉” - 这里有ingredientValue,measureType,ingredientName。 我建议创建一个代表这一行的小数据类,以及它将成为这个类的属性的所有类型的数据 好处是遗忘:
- 无需用正则表达式魔法替换 - 易于扩展和修改

正则表达式所需要的就是创建提供的数据行的正确解析器。但是肯定的是,替换它的技巧会更容易。

答案 3 :(得分:0)

void Main()
{
  string ingredients =
@"500g Flour
0.5g Salt
7g Dry yeast
45ml Olive oil
309ml Water";

  string pattern = @"(?:[0-9]+\.?[0-9]*|\.[0-9]+)";

  int multiple = 2;

  Regex.Replace(ingredients, pattern, m => (Convert.ToDecimal(m.Value)*multiple).ToString()).Dump();
}

我在LINQPad中这样做了所以不要担心只是输出结果的Dump()。我将盐更改为0.5只是为了表明它适用于非整数。这种模式是我能想出的匹配整数和小数(在十进制之前有或没有任何数字)的最佳模式,所以它将匹配17,3.141592或.5