44

私は正規表現の使用にかなり慣れていないため、読んだいくつかのチュートリアルに基づいて、適切にフォーマットされた Regex.Replace でこの手順を実行できません。

これが私が取り組んでいるシナリオです...リストボックスからデータを取得するとき、それをCSVのような形式にフォーマットしてからファイルを保存したいと思います。置換オプションの使用は、このシナリオにとって理想的なソリューションですか?

正規表現のフォーマット例の前。

FirstName LastName Salary    Position
-------------------------------------
John      Smith    $100,000.00  M

正規表現置換後の提案形式

John Smith,100000,M

現在のフォーマット状態の出力:

John,Smith,100000,M

*注 - 最初のコンマを空白に置き換える方法はありますか?

私のコードのスニペット

using(var fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write))
{
    using(var sw = new StreamWriter(fs))
    {
        foreach (string stw in listBox1.Items)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(stw);

            //Piecing the list back to the original format
            sb_trim = Regex.Replace(stw, @"[$,]", "");
            sb_trim = Regex.Replace(sb_trim, @"[.][0-9]+", "");
            sb_trim = Regex.Replace(sb_trim, @"\s", ",");
            sw.WriteLine(sb_trim);
        }
    }
}
4

4 に答える 4

20

これを試して::

sb_trim = Regex.Replace(stw, @"(\D+)\s+\$([\d,]+)\.\d+\s+(.)",
    m => string.Format(
        "{0},{1},{2}",
        m.Groups[1].Value,
        m.Groups[2].Value.Replace(",", string.Empty),
        m.Groups[3].Value));

これは、少なくとも正規表現を使用すると、得られるのと同じくらいクリーンな答えです。

  • (\D+): 最初のキャプチャ グループ。1 つ以上の数字以外の文字。
  • \s+\$: 1 つまたは複数の空白文字の後に、リテラルのドル記号 ($) が続きます。
  • ([\d,]+): 2 番目のキャプチャ グループ。1 つ以上の数字またはカンマ。
  • \.\d+: 小数点、次に少なくとも 1 桁。
  • \s+: 1 つ以上の空白文字。
  • (.): 3 番目のキャプチャ グループ。非改行文字。

さらに、2 番目のキャプチャ グループでは、カンマを削除する必要があります。別の正規表現を使用してこれを行うこともできますが、これは本当に不必要であり、パフォーマンスに悪影響を及ぼします。これが、ラムダ式と文字列形式を使用して置換を組み合わせる必要がある理由です。そうでない場合は、ラムダ式の代わりにこれを代わりに使用できます。

"$1,$2,$3"
于 2013-04-20T05:57:04.333 に答える