String が特定のパターンにあるかどうかを確認したい。
たとえば、文字列がパターン 2012-02-20 に一致するかどうかを確認したい。
IE: x が数字の場合、xxxx-xx-xx。
出来ますか?誰かが正規表現を言いました。
この正規表現を使用します\d{4}-\d{2}-\d{2}
使用を確認するため:
yourString.matches(regexString);
SimpleDateFormat解析メソッドを使用してそれを行うことができます。
final SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
boolean matchesDateFormat(String date)
{
try
{
format.parse(date);
return true;
}
catch(ParseException e)
{
return false;
}
}
もちろん、後でとにかく日付を解析する場合は、これをスキップして解析を試みることができます。
日付文字列が有効な日付かどうかをテストする場合は、SimpleDateFormat
check を使用することをお勧めします。その検証に正規表現を使用しないでください。月は 13 ですか? 日付は50ですか?うるう年?
いくつかの例:
public boolean isValidDate(String dateString) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
df.parse(dateString);
return true;
} catch (ParseException e) {
return false;
}
}
@burning_LEGION の正規表現を使用して、文字列が 4 桁、ダッシュ-
、2 桁、ダッシュ、および 2 桁の正確な形式に従っていることを確認できます。-
ただし、文字列が有効な日付を表しているかどうかはチェックしません。指定でき9999-99-99
、検証に合格します。
SimpleDateFormatを使用することは、文字列が有効な日付であり、特定の表現形式に従っていることを確認する適切な方法です。SimpleDateFormat は、日付の書式設定とは別に、文字列から日付を解析するためにも使用できます: parse(String)
, parse(String, ParsePosition)
.
デフォルトでは、SimpleDateFormat はlenient2013-025-234
です。つまり、渡すなどの無意味な日付を許可します。を使用setLenient(boolean lenient)
するfalse
と、この問題が解決します。
ただし、別の問題は、有効な日付より後のガベージ データも無視することです (例: 2012-03-23garbage#$%$#%
)。寛大に設定しても、この問題は解決しません。メソッドで最後の位置を確認する必要がありparse(String, ParsePosition)
ます。
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
// Make the parsing strict - otherwise, it is worse than regex solution
dateFormatter.setLenient(false);
Date date = null;
ParsePosition pos = new ParsePosition(0);
date = dateFormatter.parse(inputString, pos);
if (date != null && pos.getIndex() == inputString.length()) {
// These 3 points are ensured:
// - The string only contains the date.
// - The date follows the format strictly.
// - And the date is a valid one.
} else {
// Valid date but string contains other garbage
// Or the string has invalid date or garbage
}
SimpleDateFormat
2013-1-5
これは妥当な寛大さだと思います。これを望まない場合は、String をparse
メソッドにプラグインする前に、正規表現に対してチェックを行うことができます。
次のコードを確認できます。
public void test() {
String REG_EXP = "(\\d{4}-[0,1]?\\d{1}-[0,1,2,3]?\\d{1})"; //yyyy-mm-dd formate this can not check boundary condition something like this... 1981-02-30
String REG_EXP1 = "(\\d{4}-\\d{2}-\\d{2})"; // if u just want xxxx-xx-xx where x is number
String input = "date1 1981-09-06 wrong date 9999-22-22 date2 1981-9-09 date3 1981-11-1 date4";
Pattern pattern = Pattern.compile(REG_EXP);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group());
}
}