返回

正则表达式教程:日期(宽松)

正则表达式

## 宽松日期格式的正则表达式

日期格式千差万别,从严格的 ISO 8601 格式到随意拼凑的数字和字符。处理日期数据时,使用正则表达式可以帮助你提取和验证日期,即使格式不完全准确。

本博客将介绍一种宽松的日期格式正则表达式,它允许对各种不规范的日期格式进行匹配。

### 正则表达式

/^\d{1,4}(-)(1[0-2]|0?[1-9])\1(0?[1-9]|[1-2]\d|30|31)$/

### 解释

正则表达式由以下部分组成:

  • 年份 (YYYY): 1 到 4 位数字 (\d{1,4})。
  • 分隔符: 连字符 (-)。
  • 月份 (MM): 1 或 2 位数字 (1[0-2]|0?[1-9]),范围为 1-12。
  • 分隔符: 连字符 (-)。
  • 日期 (DD): 1 或 2 位数字 (0?[1-9]|[1-2]\d|30|31),范围为 1-31。

### 注意:

  • 该正则表达式允许年份为 1 到 9999。
  • 月份和日期允许前导零。
  • 日期允许范围为 1-31,不考虑特定月份的天数限制。

### 使用场景

此正则表达式可用于匹配以下格式的宽松日期:

  • 1990-12-12
  • 2001-01-01
  • 9999-12-31
  • 0001-01-01

### 代码示例

JavaScript:

const regex = /^\d{1,4}(-)(1[0-2]|0?[1-9])\1(0?[1-9]|[1-2]\d|30|31)$/;
const testText = "1990-12-12,1-1-1,0000-1-1";
const matches = testText.match(regex);
console.log(matches); // ["1990-12-12"]

Java:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexExample {
    public static void main(String[] args) {
        String regex = "^\\d{1,4}(-)(1[0-2]|0?[1-9])\\1(0?[1-9]|[1-2]\\d|30|31)
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexExample {
    public static void main(String[] args) {
        String regex = "^\\d{1,4}(-)(1[0-2]|0?[1-9])\\1(0?[1-9]|[1-2]\\d|30|31)$";
        String testText = "1990-12-12,1-1-1,0000-1-1";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(testText);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}
quot;
; String testText = "1990-12-12,1-1-1,0000-1-1"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(testText); while (matcher.find()) { System.out.println(matcher.group()); } } }

PHP:

<?php
$regex = "/^\d{1,4}(-)(1[0-2]|0?[1-9])\1(0?[1-9]|[1-2]\d|30|31)$/";
$testText = "1990-12-12,1-1-1,0000-1-1";
preg_match_all($regex, $testText, $matches);
print_r($matches[0]); // ["1990-12-12"]
?>

Python:

import re

regex = r"^\d{1,4}(-)(1[0-2]|0?[1-9])\1(0?[1-9]|[1-2]\d|30|31)
import re

regex = r"^\d{1,4}(-)(1[0-2]|0?[1-9])\1(0?[1-9]|[1-2]\d|30|31)$"
testText = "1990-12-12,1-1-1,0000-1-1"
matches = re.findall(regex, testText)
print(matches)  # ['1990-12-12']
quot;
testText = "1990-12-12,1-1-1,0000-1-1" matches = re.findall(regex, testText) print(matches) # ['1990-12-12']

## 常见问题解答

  1. 该正则表达式允许哪些格式的日期?

它允许各种不规范的日期格式,包括:

  • 年份为 1 到 4 位数字
  • 月份和日期允许前导零
  • 日期允许范围为 1-31,不考虑特定月份的天数限制
  1. 该正则表达式不允许哪些格式的日期?

它不允许带有前导或后缀空格的日期,也不允许使用斜线或点作为分隔符。

  1. 如何使用该正则表达式?

你可以在各种编程语言中使用正则表达式库来匹配和提取日期。具体语法和方法根据语言而异。

  1. 该正则表达式有哪些缺点?

由于它允许日期范围为 1-31,而不考虑特定月份的天数限制,因此可能会出现错误匹配。

  1. 是否有更严格的日期正则表达式?

是的,有更严格的正则表达式可以强制特定的日期格式和限制,例如 ISO 8601 格式。