簡體   English   中英

正則表達式(替換)? 只匹配第一次和不同的出現

[英]Regex (Replace)? to match only first and distincted occurences

我遇到了正則表達式的問題。 基本上我有一個包含日期的標題的word文檔。 准備了一個算法,它將從日期中減去數據,並且當每個日期在文件中只有一次時沒有問題,但是當我在每一頁的開頭都有日期時,這種划分就不能正常工作。 我嘗試在(?<day>\d{1,2})-(?<month>\d{1,2})-(?<year>\d{2,4})(?![\s\S]*\1)但它只匹配最后一個日期,如果我有 3 頁專門用於一天,它只匹配從最后一個。 是否有可能創建僅匹配第一次和不同出現的正則表達式? 因此,如果我有一個日期 3 次,它將匹配第一個日期並且數據將被正確划分? 另一種選擇是我可以替換字符串中不是第一個日期的所有內容。

正則表達式實際上可能像

 (?<day>\d{1,2})-(?<month>\d{1,2})-(?<year>\d{2,4})

文件:

 13-08-2020
 data day1 
 13-08-2020 
 data day1  
 13-08-2020 
 data day1 
 14-08-2020
 data day2

我想讓那個正則表達式只匹配 13-08-2020 的第一次出現,然后是 14-08-2020 的第一次出現,或者用空格替換日期,這樣它看起來像

13-08-2020
data day1
data day1
data day1
14-08-2020
data day2

您可以通過后視來做到這一點。 以下正則表達式使用肯定的后視並匹配之前已經發生的任何日期:

(?<=[\s\S]*^(\d{1,2}-\d{1,2}-\d{2,4})$[\s\S]*)(^\1$) 

這是一個完整的 C# 示例(例如,您可以在https://dotnetfiddle.net/進行測試),它用空字符串替換所有匹配的日期:

using System;
using System.Text.RegularExpressions; 
                    
public class Program
{
    public static void Main()
    {
        string myText = "13-08-2020\n"
                      + "data day1\n"
                      + "13-08-2020\n"
                      + "data day1\n"
                      + "13-08-2020\n"
                      + "data day1\n"
                      + "14-08-2020\n"
                      + "data day2";
        string pattern = @"(?<=[\s\S]*^(\d{1,2}-\d{1,2}-\d{2,4})$[\s\S]*)(^\1$)";
        string CleanedString = Regex.Replace(myText, pattern, "", RegexOptions.Multiline);  
        Console.Write(CleanedString); 
    }
}

結果:

13-08-2020
data day1

data day1

data day1
14-08-2020
data day2

請注意,這種形式的表達式僅適用於多行模式,即當“^”和“$”匹配開始/結束而不是字符串開始/結束時。

我將此解決方案基於如何使用 RegEx 刪除文本中的非連續行?

暫無
暫無

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

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