java - 可变日期长度的 Java 正则表达式模式
问题描述
需要:设置正则表达式模式以提取作为字符串子集的日期信息。
问题:月份和日期不是固定长度,即一月到九月用一位数表示,十月到十二月用两位数表示。日期 1 到 9 也是个位数,10 - 31 是 2 位数
字符串可以是以下任何一种格式:
"CompanyUIP198710800ST" : Name YYMD nnnnn cc (i.e. CompanyUIP 1987 10800 ST)
"CompanyA1982210800ST" : Name YYMDD nnnnn cc (i.e. CompanyA 19822 10800 ST)
"CompanyVT191039405YT" : Name YYMMD nnnn cc (i.e. CompanyVT 19103 9405 YT)
"CompanyBX1910249405YT" : Name YYMMDD nnnn cc (i.e. CompanyBX 191024 9405 YT)
在上面:
- 第一部分是公司名称
- 接下来的 4 或 6 位数字代表日期
- 接下来的几位数字(可变长度)代表标识号
- 最后 2 个字符是后缀 appender 总是 2 个字符
模式:我可以使用以下正则表达式获取公司名称部分
stringWord.replaceFirst("^(\\D+).*$", "$1")
我尝试了下面的,它看起来很笨拙,而且因为我一开始不知道月份或日期的长度,我需要用 4、5 和 6 替换 lengthDate 变量,然后删除错误的变量(即更多步骤和笨拙)。
int lengthDate = 4;
stringWord.substring(stringWord.replaceFirst("^(\\D+).*$", "$1").length(),
stringWord.replaceFirst("^(\\D+).*$", "$1").length() + lengthDate);
希望我面临的问题很清楚并等待建议我如何使用单个正则表达式模式来实现所有 4 种日期格式。
解决方案
有一些用于分隔数字的逻辑,您可能希望查看您的数据并提出一些不同的表达式,每个表达式将覆盖您的数据的一部分,然后使用交替连接它们。
例如,在我看来,我们有两个类:
^(\D+)([0-9]{4,})(9[0-9]{3})([A-Z]{2})$
和
^(\D+)([0-9]{4,})([0-9]{5})([A-Z]{2})$
将它们结合起来,将使它:
^(\D+)([0-9]{4,})(9[0-9]{3})([A-Z]{2})$|^(\D+)([0-9]{4,})([0-9]{5})([A-Z]{2})$
测试
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class re{
public static void main(String[] args){
final String regex = "^(\\D+)([0-9]{4,})(9[0-9]{3})([A-Z]{2})$|^(\\D+)([0-9]{4,})([0-9]{5})([A-Z]{2})$";
final String string = "CompanyUIP198710800ST\n"
+ "CompanyA1982210800ST\n"
+ "CompanyVT191039405YT\n"
+ "CompanyBX1910249405YT";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
正则表达式电路
jex.im可视化正则表达式:
如果您想探索/简化/修改表达式,它已在 regex101.com的右上角面板中进行了说明。如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。
推荐阅读
- google-cloud-platform - 如何将本地数据工作流迁移到 Google Cloud?
- python-3.x - pytorch中的类型不匹配
- postgresql - 将列乘以一的不同值
- unix - 如何记录我的 SFTP 命令的输出
- mysql - 从另一个表中选择每个组和关联行的最高值,按最高值排序
- ios - SwiftUI DatePicker 绑定可选日期,有效 nil
- android - mp4parser - 如何开始使用?
- timeout - 使用 puppeteer,在 TimeoutError 上截取当前状态
- c# - 错误 CS0246:找不到类型或命名空间名称“IApplicationBuilderExtensions”
- python - 为什么BST(二叉搜索树)这么慢