我想要实现的是使用从(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);
非常感谢任何解决方案。
答案 0 :(得分:4)
第一个问题是你的正则表达式只匹配不是数字的字符。
更正:它使用正斜杠而不是反斜杠,所以它匹配任何不是斜杠或d
的东西将正则表达式更改为@"\b(\d+)"
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