【问题标题】:how to use pattern matcher for date regex?如何为日期正则表达式使用模式匹配器?
【发布时间】:2016-02-24 23:34:24
【问题描述】:

如果我有例如 1776 年 7 月 4 日是美国的独立日 今天的日期是 2016 年 2 月 25 日,我怎么可能从句子中得到“1776 年 7 月 4 日”和“2016 年 2 月 25 日”并将它们更改为 yyyy_date_month 的格式?

public final static String regex = StringUtils.join(new String[]{
            String.format("(%s)", StringUtils.join(
                    //date
                    "((3[01]|2\\d|1\\d|0?\\d)" +
                    //ordinals
                    "(st|nd|rd|th)?(\\sof)?" +
                   // month,
                   "(\\s?(jan(uary)?|feb(ruary)?|mar(ch)?|apr(il)?|may|jun(e)|jul(y)|aug(ust)?|sep(tember)?|oct(ober)?|nov(ember)?|dec(ember)?))"+
                    //year
                    "?(\\d{4})?)"

            )),
            String.format("(%s)", StringUtils.join(//mm/dd/yyyy format
                    //month/
                    "^(0[1-9]|1[0-2])" +
                    // - | /
                    "(\\/|-)?" +
                    //date/
                   "(\\s0[1-9]|\\s1\\d|\\s2\\d|\\s3[01])" +
                   // - | /
                   "(\\/|-)?" +
                   //year
                   "(\\s\\d{4})"

            }, "|");
            public Dates() {

        Pattern[] patterns = new Pattern[regex.length()];
        for (int i = 0; i < regex.length(); i++) {
            patterns[i] = Pattern.compile(regex);
        }
        this.patterns = patterns;
    }

【问题讨论】:

    标签: java regex date


    【解决方案1】:

    你可以试试这样的:

    public static void main (String[] args) throws java.lang.Exception
    {
        Pattern p = Pattern.compile( "((\\w+)\\s*(\\d{1,2})\\s*(\\d{4}))|((\\d{1,2})\\/(\\d{1,2})\\/(\\d{4}))" );
        String input_1 = "July 4 1776 was bla bla";
        String input_2 = "02/25/2016";
        Matcher m = p.matcher( input_1 );
        String month = null;
        String day = null;
        String year = null;
        String formatted_date = null;
        if( m.find() )
        {
            System.out.println("Found groups :" + m.group() );
            String found = m.group();
            if( found.matches("((\\d{1,2})\\/(\\d{1,2})\\/(\\d{4}))") )
            {
                p = Pattern.compile("(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})");
                m = p.matcher(found);
                if( m.find() )
                {
                   month = m.group(1);
                   day = m.group(2);
                   year = m.group(3);
                   String formatteddate =  year + "_" + day + "_" + month;
                   System.out.println(input_1.replaceAll("((\\d{1,2})\\/(\\d{1,2})\\/(\\d{4}))", formatteddate));
                }
    
            }
            else if( found.matches("((\\w+)\\s*(\\d{1,2})\\s*(\\d{4}))") )
            {
                p = Pattern.compile("(\\w+)\\s*(\\d{1,2})\\s*(\\d{4})");
                m = p.matcher(found);
                if( m.find() )
                {
                   month = m.group(1);
                   day = m.group(2);
                   year = m.group(3);
                   String formatteddate =  year + "_" + day + "_" + month;
                   System.out.println(input_1.replaceAll("((\\w+)\\s*(\\d{1,2})\\s*(\\d{4}))", formatteddate));
                }
    
    
            }
    
    
        }
        else
        {
            System.out.println("No groups found");
        }
    }
    
    public static boolean isInteger(String s) 
    {
       try 
       { 
         Integer.parseInt(s); 
       } catch(NumberFormatException e) 
       { 
         return false; 
       } catch(NullPointerException e) 
       {
         return false;
       }
    
       return true;
    }
    

    查看演示here

    【讨论】:

    • 谢谢,但我也想在我的例子中包含这样的声明,我应该得到 1776_july_4 的值是独立日......我怎么能这样做?跨度>
    • 我以为你想要1776_4_July,我更改了代码并进行了演示。你可以检查一下。如果您想要02/25/2016 的日期,只需更改Matcher m = p.matcher( input_2 ) 行中的输入
    • 对不起,是的,是 1776_4_july,我只想知道如何在打印中不仅包含格式化的日期,还包括字符串的其余部分,例如 input_1 = 1776 年 7 月 4 日是 bla bla bla “所以我的打印应该看起来像 1776_4_july 是 bla bla bla bla 任何方法吗?提前谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2012-04-16
    • 2012-04-16
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多