亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式將字符串中的日期與 where 子句匹配

正則表達式將字符串中的日期與 where 子句匹配

C#
波斯汪 2022-11-21 20:37:20
我需要從下面的示例文本中獲取日期字符串,即2019-01-22 15:36:141,023 ,僅當該行包含Correct而不是Test12單詞時。所以理想情況下,我應該在下面的字符串中得到兩個匹配項(第 3 行和第 5 行)。第 1 行:2019-01-22 15:36:141,043:[測試][123] 信息 - 測試:正確的 Test12 ping第 2 行:2019-01-22 15:36:141,029:[測試][124323] 信息 - 測試:錯誤的 Test12 ping第 3 行:2019-01-22 15:36:141,023:[測試][12554363] 信息 - 測試:正確測試 ping第 4 行:2019-01-22 15:36:141,123: [Test][6761213] INFORMATION - Testing: Wrong Test12 ping第 5 行:2019-01-22 15:36:141,093:[測試][46543123] 信息 - 測試:測試 ping 無效第 6 行:2019-01-22 15:36:141,890:[測試][887] 信息 - 測試:正確測試 ping我可以用(?\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}(?:,\ d{3}\b)?)但不確定如何包含其他條件。任何線索?
查看完整描述

3 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

在不增加 regex 額外復雜性的情況下,您可以遍歷文件中的行并執行檢查Test12并Correct使用常規字符串方法:


var results = new List<string>();

using (var sr = new StreamReader(filepath, true)) 

{

    var line = "";

    while ((line=sr.ReadLine()) != null)

    {

        if (line.Contains("Correct") && !line.Contains("Test12")) 

        {

            var res = Regex.Match(line, @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2,}(?:,\d{3}\b)?");

            if (res.Success)

            {

                results.Add(res.Value);

            }

        }

    }

}

使用正則表達式,如果要檢查是否存在的單詞出現在使用日期之后


\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2,}(?:,\d{3}\b)?(?!.*Test12)(?=.*Correct)

                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^

請參閱正則表達式演示。


在這里,(?!.*Test12)(?=.*Correct)先行確保 1) 沒有Test12和 2)Correct在當前位置右側(即日期之后)除換行符之外的任何 0+ 個字符之后有一個子字符串。


如果這些詞可能出現在字符串中的任何位置,您可以使用


(?m)\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2,}(?:,\d{3}\b)?(?=.*\r?$(?<!Test12.*)(?<=Correct.*))

                                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

請參閱此正則表達式演示。


在這里,該(?m)選項將 設置RegexOptions.Multiline為true以便$可以將其解析為行尾錨點,并且(?=.*\r?$(?<!Test12.*)(?<=Correct.*))正向先行執行以下檢查:它要求到行尾為止有 0+ 個字符,然后,在在該行的末尾,這兩個檢查是使用后視執行的:負后視(?<!Test12.*)確保一行中沒有Test12 任何地方,而正后視(?<=Correct.*)確保一行中的任何地方Correct都有子字符串。


可選的\r?CR before$是必需的,因為一個相當煩人的事實是在多行模式下$不匹配 before \r。


查看完整回答
反對 回復 2022-11-21
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

我認為您的意思是第 3 行和第 6 行匹配,因為第 5 行不包含Correct.

要不包含“Test12”,您可以使用否定前瞻。要在之后匹配“正確”,您可以在您的模式中匹配它并使用單詞邊界\b來防止它成為更大單詞的一部分。

您的模式可能如下所示:

^(?!.*\bTest12\b).*?(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2,}(?:,\d{3}\b)?).*\bCorrect\b.*$

這將匹配:

  • ^字符串的開始

  • (?!.*\bTest12\b)斷言以下內容不包含Test12

  • .*?匹配任何非貪婪的字符

  • (\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2,}(?:,\d{3}\b)?)在一個組中捕獲像模式一樣的日期

  • .*匹配任意字符 0+ 次

  • \bCorrect\b匹配正確

  • .*匹配任意字符 0+ 次

  • $字符串的結尾

正則表達式演示C# 演示

筆記

這部分是否也應該像查看示例數據(?:,\d{3}\b)?一樣匹配逗號前的數字?(?:\d,\d{3}\b)?


查看完整回答
反對 回復 2022-11-21
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

這是沒有正則表達式的一種方法。日期看起來不正確。我認為逗號位置錯誤,所以我修復了它。


            DateTime today = DateTime.Parse("2019-01-22 15:36:14");

            string input =

                "2019-01-22 15:36:14,1023: [Test][123] INFORMATION - Testing: Correct Test12 ping\n" +

                "2019-01-22 15:36:14,1023: [Test][124323] INFORMATION - Testing: Wrong Test12 ping\n" +

                "2019-01-22 15:36:14,1023: [Test][12554363] INFORMATION - Testing: Correct Test ping\n" +

                "2019-01-22 15:36:14,1023: [Test][6761213] INFORMATION - Testing: Wrong Test12 ping\n" +

                "2019-01-22 15:36:14,1023: [Test][46543123] INFORMATION - Testing: Invalid Test ping\n" +

                "2019-01-22 15:36:14,1023: [Test][887] INFORMATION - Testing: Correct Test ping";


            StringReader reader = new StringReader(input);

            string line = "";


            while ((line = reader.ReadLine()) != null)

            {

                string[] splitDate = line.Split(new string[] { ": [Test]" }, StringSplitOptions.None);

                DateTime date = DateTime.ParseExact(splitDate[0].Replace(",","."), "yyyy-MM-dd HH:mm:ss.FFFF", System.Globalization.CultureInfo.InvariantCulture);

                string[] splitTest = splitDate[1].Split(new char[] { ':' });


                if ((date.Date == today.Date) && splitTest[1].Contains("Correct") && !splitTest[1].Contains("Test12"))

                {

                    Console.WriteLine(line);

                }

            }

            Console.ReadLine();


查看完整回答
反對 回復 2022-11-21
  • 3 回答
  • 0 關注
  • 121 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號