簡體   English   中英

正則表達式獲取模式的最后一次出現

[英]Regex get last occurrence of the pattern

我有一個字符串,我需要選擇模式的最后一次出現。 字符串是:

[[[1302638400000.0,0],[1302724800000.0,610.64999999999998],[1302811200000.0,2266.6500000000001],[1303156800000.0,4916.9300000000003],[1303329600000.0,6107.3199999999997],[1303934400000.0,9114.6700000000001] ,, [[130263840.00.000000000] ],[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 ],[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.00.0、21.753250000000229008 ],[1303352311000.0、26.8766],[1303815010000.0、30.536599999999996],[1303815028000.0、27.703349999999993]]];

我使用的模式是:

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

不幸的是,它僅選擇第一個事件。 高亮顯示的文本是所需的結果。 到底有多少個方括號都沒有關系,只需要最后一個數組集即可。

更新:如果可以幫助您,則編碼使用c#

使用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]]]

對最后一組[[和捕獲。

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

在這里看到它。

嘗試將$像這樣\\s\\[\\[(.*?)\\]\\]\\]\\;$添加到您的模式中\\s\\[\\[(.*?)\\]\\]\\]\\;$然后讓我知道它是否有效。

目前,我手頭沒有重擊,所以無法檢查,但應該可以解決。

編輯:正確的版本\\S+\\s?+(?!((.*\\[\\[)))

轉換為:

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

這是Rubular示例

順便說一句很棒的工具rubular,讓我想更深入地研究ruby和正則表達式:D

應該有一個全局標志或一種方法來返回您語言中的所有匹配項。 使用它並進行最后一場比賽。

在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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM