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
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 に答える
0

異なるタイプのデータをデータ行に保持することはお勧めできません。あなたのサンプルでは: "500g Flour" - ここでは、individualValue、measureType、individualName があります。この行を表す小さなデータ クラスを作成し、すべてのタイプのデータをこのクラスのプロパティにすることをお勧めします。
利点は明らかです:
- 正規表現マジックに置き換える必要はありません
- 拡張と変更が簡単です

正規表現で必要なのは、提供されたデータ行の正しいパーサーを作成することだけです。しかし、確かに、replace でトリックするよりも簡単です。

于 2012-09-14T22:28:28.027 に答える