1

我写了一个小应用程序来从字符串中截取正确的日期。当我有一个字符串时,可以说“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-12”)

4

1 回答 1

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)");

(?<!...)是一个消极的向后看:“找到一个与之前不匹配的位置...”。

(?!...)是一个否定的前瞻:“找到后面的内容不匹配的位置...”。

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

于 2013-06-09T16:24:07.020 回答