返回
正则表达式教程:日期(宽松)
正则表达式
2024-02-28 15:58:39
## 宽松日期格式的正则表达式
日期格式千差万别,从严格的 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 到 4 位数字
- 月份和日期允许前导零
- 日期允许范围为 1-31,不考虑特定月份的天数限制
- 该正则表达式不允许哪些格式的日期?
它不允许带有前导或后缀空格的日期,也不允许使用斜线或点作为分隔符。
- 如何使用该正则表达式?
你可以在各种编程语言中使用正则表达式库来匹配和提取日期。具体语法和方法根据语言而异。
- 该正则表达式有哪些缺点?
由于它允许日期范围为 1-31,而不考虑特定月份的天数限制,因此可能会出现错误匹配。
- 是否有更严格的日期正则表达式?
是的,有更严格的正则表达式可以强制特定的日期格式和限制,例如 ISO 8601 格式。