快速入門
教學
工具和語言
範例
參考
書籍評論
範例
正規表示式範例
數字範圍
浮點數
電子郵件地址
IP 位址
有效的日期
數字日期轉文字
信用卡號碼
符合完整行
刪除重複行
程式設計
兩個相近的字詞
陷阱
災難性的回溯
重複太多次
拒絕服務
讓所有東西都可選擇
重複的擷取群組
混合 Unicode 和 8 位元
此網站的更多資訊
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於此網站
RSS 摘要和部落格
RegexBuddy—The most comprehensive regular expression library!

用文字日期取代數字日期

此範例顯示如何將 1/1/50 或 01/01/50 到 12/31/49 的數字日期替換為文字等效日期,從 1950 年 1 月 1 日到 2049 年 12 月 31 日。如果你可以根據匹配的內容改變替換,則只需一個正規表示式就能做到這一點。執行此操作的一種方法是在程序碼中建立每個替換。此範例顯示如何使用替換字串條件來執行此操作。此範例可搭配PowerGREP 5、Boost C++ 函式庫和PCRE2 C 函式庫使用。

若要能夠使用替換字串條件,正規表示式需要為需要不同替換的每一個比對部分建立一個獨立的擷取群組。每個月份都需要替換成其名稱,因此我們需要一個獨立的擷取群組來比對每個月份號碼。以 1、2 和 3 結尾的基數需要有獨特的字尾。因此我們需要四個群組來比對以 1、2、3 或其他數字結尾的日期號碼。我們假設年份號碼 50 至 99 為 1950 至 1999,而年份號碼 00 至 49 為 2000 至 2049。因此我們需要再兩個群組來比對每個半世紀。

正規表示式

將這一切組合在一起會產生一個相當長的正規表示式。 自由間距 有助於保持其可讀性。正規表示式的結構與您用於 比對有效日期 的結構相同。它只會更冗長,因為我們需要 12 個 選項 來比對月份、4 個選項來比對日期,以及 2 個選項來比對年份。

\b
(?: # Month
   
(?'jan'0?1)|(?'feb'0?2)|(?'mar'0?3)|(?'apr'0?4)|(?'may'0?5)|(?'jun'0?6)
  
|(?'jul'0?7)|(?'aug'0?8)|(?'sep'0?9)|(?'oct'10)|(?'nov'11)|(?'dec'12)
  
) /
0?(?: # Day
   
(?'1st'[23]?1)|(?'2nd'2?2)|(?'3rd'2?3)|(?'nth'30|1[123]|[12]?[4-90])
  
) /
(?: # Year
   
(?'19xx'[5-9][0-9])|(?'20xx'[0-4][0-9])
  
)
\b

替換字串

替換字串將使用反向參照來重新插入日期號碼。由於我們希望從替換中省略前導零,因此我們將 0? 放在日期號碼的擷取群組之外。這表示我們的正規表示式也允許 10 至 31 日的前導零。由於我們的目標是替換日期,而不是驗證它們,因此我們可以接受這一點。否則,我們將需要兩組四個選項來比對月份中的日期。一組用於個位數日期,一組用於兩位數日期。

很遺憾,自由間距不適用於替換字串。因此替換包含一行非常長的字串。它在此處分成多行以符合頁面寬度。這是使用 Boost 語法的替換

(?{jan}一月)(?{feb}二月)(?{mar}三月)(?{apr}四月)(?{may}五月)(?{jun}六月)
(?{jul}七月)(?{aug}八月)(?{sep}九月)(?{oct}十月)(?{nov}十一月)
(?{dec}十二月) (?{1st}${1st})(?{2nd}${2nd})(?{3rd}${3rd})(?{nth}${nth})
(?{19xx}19${19xx})(?{20xx}20${20xx})

這是使用 PCRE2 語法的替換

${jan:+一月}${feb:+二月}${mar:+三月}${apr:+四月}${may:+五月}${jun:+六月}
${jul:+七月}${aug:+八月}${sep:+九月}${oct:+十月}${nov:+十一月}
${dec:+十二月} ${1st:+${1st}}${2nd:+${2nd}}${3rd:+${3rd}}${nth:+${nth}}
${19xx:+19${19xx}}${20xx:+20${20xx}}

首先,我們有 12 個條件式,參考 12 個用於月份的擷取群組。每個條件式會在群組參與時插入月份名稱。當群組未參與時,它們不會插入任何內容。由於在任何比對中只會有一個群組參與,因此只會有一個條件式實際插入任何內容到替換中。

接著,我們有一個文字空格和另外 4 個條件式,參考 4 個用於日期的擷取群組。當群組參與時,條件式會使用 反向參照 到同一個群組,以重新插入群組比對到的日期數字。反向參照後接一個文字字尾。

最後,我們有一個文字逗號、一個文字空格和另外 2 個條件式,用於年份。條件式再次使用文字和反向參照,將年份從 2 位數擴充為 4 位數。