17

文字列があり、パターンの最後の出現を選択する必要があります。文字列は次のとおりです。

[[[1302638400000.0、0]、[1302724800000.0、610.64999999999998]、[1302811200000.0、2266.6500000000001]、[1303156800000.0、4916.9300000000003]、[1303329600000.0、6107.3199999999997]、[1303934400000.0、9114.6700000000001]]、[[130263840000 ]、[1302811200000.0、20000.0]、[1303156800000.0、20000.0]、[1303329600000.0、20000.0]、[1303934400000.0、20000.0]]、[[1302638400000.0、20000.0]、[1302724800000.0、20610.650000000001]、[1302811200000.0、22266.650000000001]、[1303156800000.0 ]、[1303329600000.0、26107.32]、[1303934400000.0、29114.669999999998]、[1304452800000.0、30078.23]]、[[1302718580000.0、0.0]、[1302772440000.0、3.0532500000000073]、[1303107093000.0、11.333250000000007]、[1303107102000.0、21.753250000000008]、[1303352295000.0、24.584650000000003]、[1303352311000.0、26.8766]、[1303815010000.0、30.536599999999396]、[130 ;

私が使用するパターンは次のとおりです。

\s\[\[(.*?)\]\]

残念ながら、これは最初のオカレンスのみを選択します。強調表示されたテキストは望ましい結果です。最後に角かっこがいくつあるかは関係ありません。最後の配列セットが必要です。

更新:それがあなたを助けることができるなら、コーディングはc#にあります

4

4 に答える 4

53

RightToLeft次のオプションを使用します。

Regex.Match(s, @"\[\[(.*?)\]\]", RegexOptions.RightToLeft)

このオプションは .NET regex フレーバー専用であり、入力の先頭ではなく末尾から検索するという、まさにあなたが要求したことを行います。特に注目すべきは、貪欲でない?修飾子が期待どおりに機能することです。オフのままにしておくと、入力全体が取得されますが、次のようになります。

[[1302718580000.0, 0.0], [1302772440000.0, 3.0532500000000073], [1303107093000.0, 11.333250000000007], [1303107102000.0, 21.753250000000008], [1303352295000.0, 24.584650000000003], [1303352311000.0, 26.8766], [1303815010000.0, 30.536599999999996], [1303815028000.0, 27.703349999999993]]]

于 2012-12-13T04:30:02.017 に答える
7

最後のセットまで貪欲な試合を行い[[、キャプチャ..

.*(\[\[.*\]\])\];

こちら を参照してください

于 2012-12-12T09:08:41.883 に答える
5

あなたの言語ですべての一致を返すグローバル フラグまたはメソッドが必要です。これを使用して、最後の試合を取ります。

C# では、見つかったすべての一致を含む をMatches()返します。MatchCollectionしたがって、たとえば次のようにすることができます。

string source = "[[[1302638400000.0, 0], [1302724800000.0, 610.64999999999998], [1302811200000.0, 2266.6500000000001], [1303156800000.0, 4916.9300000000003], [1303329600000.0, 6107.3199999999997], [1303934400000.0, 9114.6700000000001]], [[1302638400000.0, 20000.0], [1302724800000.0, 20000.0], [1302811200000.0, 20000.0], [1303156800000.0, 20000.0], [1303329600000.0, 20000.0], [1303934400000.0, 20000.0]], [[1302638400000.0, 20000.0], [1302724800000.0, 20610.650000000001], [1302811200000.0, 22266.650000000001], [1303156800000.0, 24916.93], [1303329600000.0, 26107.32], [1303934400000.0, 29114.669999999998], [1304452800000.0, 30078.23]], [[1302718580000.0, 0.0], [1302772440000.0, 3.0532500000000073], [1303107093000.0, 11.333250000000007], [1303107102000.0, 21.753250000000008], [1303352295000.0, 24.584650000000003], [1303352311000.0, 26.8766], [1303815010000.0, 30.536599999999996], [1303815028000.0, 27.703349999999993]]];";
Regex r = new Regex(@"\s\[\[(.*?)\]\]");

MatchCollection result = r.Matches(source);

if (result.Count > 0) {
    Console.WriteLine(result[result.Count - 1]);
} else {
    Console.WriteLine("No match found!");
}
Console.ReadLine();
于 2012-12-12T09:13:29.577 に答える
4

このように $ をパターンに追加してみて、\s\[\[(.*?)\]\]\]\;$ うまくいくかどうか教えてください。

現在、手元に bash がないので確認できませんが、うまくいくはずです。

編集:正しいバージョン\S+\s?+(?!((.*\[\[)))

これは次のように変換されます:

\S   : all alfanumeric
\s?  : all 1 space occurences
?!   : not 
.*   : everything
\[\[ : until the last pattern of [[ (excluded)

これがRubularの例です

ところで、すばらしいツール rubular です。Ruby と正規表現をもっと調べてみたいと思います :D

于 2012-12-12T09:08:18.063 に答える