0

レシートから各項目のデータを取得するために正規表現を使用しています。領収書は次のようになります。

Qty Desc
1   JD *#
    MARTINI *#   
2   XXXXXX 
3   YYYYYY
4   JD
    PEPSI *#

すべてのアイテムに数量と説明があり、一部のアイテムには余分な*#. また、説明にはスペースを含めることができ、複数の行を含めることもできます。各行には独自の *#. 数量と説明をキャッチしたいのですが(複数行の場合はすべての行を取得します)、余分なものはまったく気にしません*#。したがって、この例では、最初の項目で Quantity=1 と Description="JD MARTINI" をキャッチします。4 番目の場合、Quantity=4 および Description="JD PEPSI" です。

私の現在の正規表現は次のようになります。

((\d+)\s+(.*)(\s+\*#)?)

それは機能していません。最後の括弧をオプションにすることで、貪欲な人(.*)がすべてを完全にキャッチできるようになるためだと思います。最後の括弧が省略可能でない場合、正規表現は extra を含む項目に対して機能しますが*#、1 番目と 3 番目の項目には一致しません (extra がないため*#)。

何か案は?

4

3 に答える 3

1

変更された質問を読んだ後、あなたが達成したいことは1つの正規表現では実行できないと判断しました。正規表現の一致と置換の組み合わせを行う必要があります。(この質問を参照してください:キャプチャ グループで文字をスキップする正規表現)

一致正規表現: (\d+)\s+([AZ\s*#]*[AZ]+)

正規表現を置換: (*#(\s*))|(\r\n\s+)(?=\s)

match 正規表現は、最後の *# を除外して、途中の改行や *# の出現を含め、数量と商品説明を一致させます。説明の最後の文字は文字であると想定しています。

match regex を実行すると、一致の配列が返されます。これを反復してオブジェクトに変換する必要があります。そのための便利なコードを書きました。オブジェクトごとに、オブジェクトの説明に対して置換正規表現を実行します。これにより、不要なスペースと *# が削除されます。

     class ReceiptItem
    {
        public int Quantity { get; set; }
        public string Description { get; set; }

        public override string ToString()
        {
            return string.Format("{0}\t{1}", Quantity, Description);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var matches = Regex.Matches(textBox1.Text, @"(\d+)\s+([A-Z\s\*\#]*[A-Z]+)", RegexOptions.Multiline);
        var items = (from Match m in matches
                     select new ReceiptItem()
                                {
                                    Quantity = int.Parse(m.Groups[1].Value),
                                    Description = Regex.Replace(m.Groups[2].Value, @"(\*\#(\s*))|(\r\n\s+)(?=\s)", "")
                                });

        listBox1.Items.AddRange(items.ToArray());
    }
于 2012-12-11T23:38:44.887 に答える
0

この正規表現を試してください(Multilineオプション付き):

(\d+)\s+(?:(.*)(?:\s+\*#)|([^#]*))$
于 2012-12-11T23:37:22.407 に答える
0

これを試してみてください。私はそれがあなたが必要とすることをすると思います。

((\d+)\s+(.+?)(\s+\*#)*)
于 2012-12-11T23:50:10.420 に答える