java - 从字符串中剪切日期

标签 java string date

<分区>

我写了一个小应用程序来从字符串中剪切一个正确的日期。当我有一个字符串时,假设“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”)

最佳答案

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

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

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

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

它们有正版本:(?<=...) , (?=...) .

关于java - 从字符串中剪切日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17011617/

相关文章:

java - 如何关闭 log4j 警告?

java - 是否可以通过 JBoss EL 解析器在 EL 中使用对象作为函数参数?

python - 从用户的输入中确定最常见的词。 [Python]

linux 脚本在 2011 年 11 月 6 日结束,但在 2011 年 11 月 7 日不结束(循环日期)

r - R中的3个字母月份和2位数字年份格式

java - JSTL 标签看不到 java 变量

r - 优化 R 中的正则表达式以进行子字符串提取

java - 如何在 Android 中将 ASCII 字符转换为字符串?

javascript - Date getTime() 在不同的机器上返回不同的值

java - 使用 for 循环创建牛眼