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

用于可变日期长度的Java正则表达式模式,java,regex,Java,Regex,需要:设置正则表达式模式以提取日期信息,日期信息是字符串的子集 问题:月份和日期不是固定长度,即一月到九月用一位数表示,十月到十二月用两位数表示。另外,日期1到9是一位数,10到31是两位数 字符串可以采用以下任意一种格式: "CompanyUIP198710800ST" : Name YYMD nnnnn cc (i.e. CompanyUIP 1987 10800 ST) "CompanyA1982210800ST" : Name YYMDD nnnnn cc (i.e. CompanyA

需要:设置正则表达式模式以提取日期信息,日期信息是字符串的子集

问题:月份和日期不是固定长度,即一月到九月用一位数表示,十月到十二月用两位数表示。另外,日期1到9是一位数,10到31是两位数

字符串可以采用以下任意一种格式:

"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") 
我尝试了下面的方法,它看起来很笨拙&而且因为我不知道开始时的月份或日期长度,我需要将lengthDate变量替换为4、5和6,然后删除错误的变量(即更多步骤和笨拙)


希望我面临的问题是清楚的&等待建议,我如何用一个单一的正则表达式模式来实现这一目标,用于所有4种类型的日期格式。

有一些逻辑用于分隔数字,您可能希望查看数据,并提出一些不同的表达式,每个表达式将覆盖数据的一部分,然后用交替法加入他们

例如,在我看来,我们有两个班:

^(\D+)([0-9]{4,})(9[0-9]{3})([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;
导入java.util.regex.Pattern;
公共类re{
公共静态void main(字符串[]args){
最后一个字符串regex=“^(\\D+)([0-9]{4,})(9[0-9]{3})([A-Z]{2})$|^(\\D+)([0-9]{4,})([0-9]{5})([A-Z]{2})$”;
最终字符串String=“CompanyUIP198710800ST\n”
+“公司1982210800ST\n”
+“公司YVT191039405YT\n”
+“公司BX1910249405YT”;
最终模式=Pattern.compile(regex,Pattern.MULTILINE);
final Matcher Matcher=pattern.Matcher(字符串);
while(matcher.find()){
System.out.println(“完全匹配:+matcher.group(0));

对于(inti=1;我不确定您是否可以区分月和日的所有组合,但请尝试
^\D+(\D{2})(1[012]|[1-9])(3[01]|[12][0-9]|[1-9])\D+[A-Z]{2}$
格式不明确。
..2019111
应该是
2019-11-01
还是
2019-01-11
?对于
公司BX191119405YT
在你们两位引用的上述特殊情况下,如果我们在10月、11月或12月,接下来的两位数字将假定为月份,如果不是月份,则假定为b假设e为1位。我知道这不是一个好的做法,但考虑到字符串格式,这是我能想到的提取此信息的最佳方法。此外,此提取每周进行一次,因此不会出现遗留日期问题。也欢迎任何其他建议。谢谢,同意格式不正确。我已要求那些支持请参阅XML文件,以确保我收到的日期格式是标准的。同时,我将尝试对您的建议进行一些修改,因为它无法识别某些情况,例如:CompanyUIP19119450ST
^(\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));
            }
        }

    }
}