5

我想要实现的是将字符串中的数字替换为从(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

4 回答 4

4

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

更正:它使用正斜杠而不是反斜杠,因此它匹配任何不是斜杠或广告的东西

将您的正则表达式更改为@"\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();
        }
    }
}
于 2012-09-14T21:32:44.450 回答
1

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

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

于 2012-09-14T21:34:25.993 回答
0

将不同类型的数据保存到数据行中不是好的做法。在您的示例中:“500 克面粉”- 这里有成分值、测量类型、成分名称。我建议创建代表这一行的小型数据类,所有类型的数据都将是该类的属性。
好处是无视的:
- 无需用正则表达式魔术替换
- 易于扩展和修改

使用正则表达式所需的只是为提供的数据行创建正确的解析器。但可以肯定的是,它比替换技巧更容易。

于 2012-09-14T22:28:28.027 回答
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()。我将 salt 更改为 0.5 只是为了表明它适用于非整数。该模式是我能想到的用于匹配整数和小数(小数点前有或没有任何数字)的最佳模式,因此它将匹配 17、3.141592 或 .5

于 2012-09-15T17:05:50.693 回答