gpt4 book ai didi

可变日期长度的 Java 正则表达式模式

转载 作者:行者123 更新时间:2023-11-30 05:30:38 25 4
gpt4 key购买 nike

需要:设置正则表达式模式来提取作为字符串子集的日期信息。

问题:月份和日期的长度不固定,即一月至九月用一位数表示,十月至十二月用两位数表示。另外,日期 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 个字符是后缀附加符,始终为 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可视化正则表达式:

enter image description here

<小时/>

If you wish to explore/simplify/modify the expression, it's been explained on the top right panel of regex101.com. If you'd like, you can also watch in this link, how it would match against some sample inputs.

<小时/>

关于可变日期长度的 Java 正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57636509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com