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-12th」からだけではありません)

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 に答える