从String中剪切日期

时间:2013-06-09 16:19:52

标签: java string date

我写了一个小应用程序来从String中删除正确的日期。当我有一个字符串,让我们说,“2007-01-12sth”它工作正常,它打印“2007-01-12”。当我有一个字符串“txt2008-01-03”它不行...我认为解释这个的最好方法是粘贴我的整个代码:

public class test
{
    public static boolean isValid(String text) {
        if (text == null || !text.matches("\\d{4}-[01]\\d-[0-3]\\d"))
            return false;
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        df.setLenient(false);
        try {
            df.parse(text);
            return true;
        } catch (ParseException ex) {
            return false;
        }
    }

    public static void main(String[] args) {

        // txt2008-01-03 is NOT ok INCORRECT, should print 2008-01-03
        // 2007-01-12sth is ok CORRECT 
        // 20999-11-11 is is NOT ok CORRECT 

        String date = "txt2008-01-03";
        Pattern p = Pattern.compile("\\d{4}-[01]\\d-[0-3]\\d");
        Matcher m = p.matcher(date);

        if(m.find())
            date = date.substring(0, m.end());

        if(isValid(date))
            System.out.println(date + " ");
    }

}

如何从“txt2008-01-03”和“2007-01-12sth”中删除日期? (不仅来自“2007-01-12sth”)

1 个答案:

答案 0 :(得分:4)

您的问题是您获取日期的方式:

if(m.find())
    date = date.substring(0, m.end());

抓住匹配器找到的东西:

if (m.find())
    date = m.group();

但是仍然存在一个问题:使用20999-11-11你的正则表达式会提取0999-11-11(也许你的初始代码是为了解释这个问题?)。用这个代替你的正则表达式:

// A date, as long as it is NOT preceded/followed by a digit
Pattern p = Pattern.compile("(?<!\\d)\\d{4}-[01]\\d-[0-3]\\d(?!\\d)");

(?<!...)是一个负面的背后:“找到以前的内容与...不匹配的位置。”

(?!...)是一个负面的预测:“找到一个位置,其中后面的内容与...不匹配。”

他们有正面版本:(?<=...)(?=...)