快速开始
教程
工具和语言
示例
参考
书评
示例
正则表达式示例
数字范围
浮点数
电子邮件地址
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 位。