2

テキストからデータを取得したい。正規表現を使用しました。私は次のようなコンテンツを持っています

    2013
        Jan        Feb         March     April    May    June
       34,101.2  12,342.7    12,451.5
Value

私の正規表現

2013.*?\s*(\d{1,3}([,]\d{3})*|\d{1,3})\.\d{1,})\s*Value

ここでは、値「12,451.5」を取得します。今、If 条件を使用したいです。つまり、取得した値が 4 月 (4 番目/n 番目の位置) の場合、それ以外の場合はコードを実行します。

では、n 番目の位置の値を取得するにはどうすればよいでしょうか。

4

2 に答える 2

1

説明

この式は次のようになります。

  • 2013 年を見つける
  • n 番目の位置で列ヘッダーをキャプチャします
  • 次の行の n 番目の位置の値を取得します

n 番目の位置を設定するには、示された両方の数値を目的の n の値に変更する必要があることに注意してください。ここに示す式は、3 番目の位置をキャプチャします。

^\s*2013[^\r\n]*[\r\n]+(?:\s+([a-z]+)(?=[\r\n\s]|\Z)){3}[^\r\n]*?[\r\n]+(?:[^\r\n0-9,.]+([0-9,.]+)(?=[\r\n\s]|\Z)){3}
                                                      ^                                                            ^
                                                      |                                                            |

ここに画像の説明を入力

これが機能するのは、キャプチャ グループを n 回繰り返すことによって、正規表現エンジンが最後に成功した一致のみを記憶するためです。ルーチンでは、返された配列をテストして、2 番目のキャプチャに値があるかどうかを確認し、それを使用します。

サンプル テキストに存在しない 4 番目の位置を示す実際の例: http://www.rubular.com/r/GUw7yLfLrQ: http://www.rubular.com/r/GUw7yLfLrQ

正常に見つかった 3 ポジションを示すライブの例: http://www.rubular.com/r/h8Y9fKK33c

サンプルテキスト

    2013
        Jan        Feb         March     April    May    June
       34,101.2  12,342.7    12,451.5
Value

コード

言語を指定しなかったので、ここでは式がどのように機能するかを簡単に示すために PHP を使用しています。

<?php
$sourcestring="your source string";
preg_match('/^\s*2013[^\r\n]*[\r\n]+(?:\s+([a-z]+)(?=[\r\n\s]|\Z)){3}[^\r\n]*?[\r\n]+(?:[^\r\n0-9,.]+([0-9,.]+)(?=[\r\n\s]|\Z)){3}/imsx',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

マッチ

[0] =>         2013
        Jan        Feb         March     April    May    June
       34,101.2  12,342.7    12,451.5
[1] => March
[2] => 12,451.5
于 2013-07-19T19:35:30.987 に答える
1

このようなことができます。モデルを作成し、リストにテキストを入力すると、非常に簡単です。

class Program
    {
        static void Main(string[] args)
        {
            Regex reg = new Regex("");

            List<Model> list = new List<Model>(); //list is filled up with your items, use a streamreader if its comma delimited etc
            list.Add(new Model {Month = "Jan", Value = "2"});
            list.Add(new Model { Month = "Feb", Value = "2" });
            list.Add(new Model { Month = "Mar", Value = "3" });
            list.Add(new Model { Month = "Apr", Value = "3" });
            list.Add(new Model { Month = "May", Value = "4" });
            list.Add(new Model { Month = "Jun", Value = "2" });


            for (int i=0; i < list.Count; i++)
            {
                if(reg.IsMatch(list[i].Value)){
                    if (list[i].Value == list[3].Value)
                    {
                        Console.WriteLine(list[i].Month +" "+ "Match april");
                    }
                }
            }

            Console.ReadLine();
        }

        public class Model
        {
            public string Month { get; set; }
            public string Value { get; set; }
        }
    }
于 2013-07-16T09:25:36.333 に答える