私は現在、grails プロジェクトで作業していますが、grails の一致制約に関する問題が発生しました。私のフィールドは、次のような日付のような形式の文字列のみを受け入れる必要があります。
2012 年 10 月 25 日午後 5 時
これは、正規表現を使用した一致制約で可能ですか? 正規表現を使用したデータ フィルタリングは、少し混乱するため、常に苦労しています。
私は現在、grails プロジェクトで作業していますが、grails の一致制約に関する問題が発生しました。私のフィールドは、次のような日付のような形式の文字列のみを受け入れる必要があります。
2012 年 10 月 25 日午後 5 時
これは、正規表現を使用した一致制約で可能ですか? 正規表現を使用したデータ フィルタリングは、少し混乱するため、常に苦労しています。
それがデータの場合、標準の日付フォーマッタを使用して検証しないのはなぜですか? お気に入り:
static constraints = {
mydate validator: {
try {
Date.parse('MM-dd-yyyy hh:mma', it)
return true
} catch (ParseException e) {
return false
}
}
}
ところで、この場合、Date
あまり有効ではない日付を解析できます (そして、 to のように正しい値に変換します15am
) 3pm
。正確に有効な形式が必要な場合は、元の値と比較できます。
static constraints = {
mydate validator: {
try {
Date date = Date.parse('MM-dd-yyyy hh:mma', it)
return Date.format('MM-dd-yyyy hh:mma', date) == it
} catch (ParseException e) {
return false
}
}
}
SimpleDateFormat
または、代わりに次を使用できます。
final static DateFormat DATEFORMAT = new SimpleDateFormat('MM-dd-yyyy hh:mma')
static constraints = {
mydate validator: {
try {
Date date = DATEFORMAT.parse(it)
return DATEFORMAT.format(date) == it
} catch (ParseException e) {
return false
}
}
}
使用できる Date オブジェクトはありませんか? わかりませんが、正規表現でお手伝いできます:
正規表現の構築は難しくありません。特にあなたの場合は簡単です:
^\d{2}-\d{2}-\d{4} \d{2}:\d{2}[AP]M$
^
文字列の先頭に一致
$
文字列の末尾に一致
\d
は数字です
{2}
前の文字を 2 回必要とする量指定子です。
[AP]
A
または一致する文字クラスです。P
この正規表現は、数字が有効な日付または時刻を表しているかどうかではなく、形式をチェックするだけです! (例: 99-99-0000 35:61PM が有効)
より簡単な情報については、私のブログ投稿を読んでください。
これを試してください:^(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])-((?:19|20)\d\d) ([0-1]?[0-9]|2[0-4]):([0-5][0-9])(?::([0-5][0-9]))?(AM|PM)$
^ Start of string
(0[1-9]|1[012]) Month
-
(0[1-9]|[12][0-9]|3[01]) Day
-
((?:19|20)\d\d) Year
([0-1]?[0-9]|2[0-4]) HH
:
([0-5][0-9]) MM
(?::([0-5][0-9]))? optional :SS
(AM|PM)
$ End of string
月、日、年、時、分、秒、AM/PM をキャプチャします。
編集: Vikas が指摘しているように、1 か月に何日あるかはチェックされません。
これを試して
\b(?:(?:(?:0?[469]|11)\-(?:0?(?:[1-9]|[12][0-9])|30)\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))|(?:(?:0?[13578]|1[02])\-(?:0?(?:[1-9]|[12][0-9])|3[01])\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))|(?:(?:0?2)\-(?:0?(?:[1-9]|1[0-9])|2[0-8])\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))) +(?:(?:(?:0?([0-9])|1[0-2])):(?:0?([0-9])|[1-5][0-9])(?:[AP]M))\b
また
\b(?:(?:(?:0?[469]|11)\-(?:0?(?:[1-9]|[12][0-9])|30)\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))|(?:(?:0?[13578]|1[02])\-(?:0?(?:[1-9]|[12][0-9])|3[01])\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))|(?:(?:0?2)\-(?:0?(?:[1-9]|1[0-9])|2[0-9])\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))) +(?:(?:(?:0?([0-9])|1[0-2])):(?:0?([0-9])|[1-5][0-9])(?:[AP]M))\b
注:dates
2 つのパターンには、 が の場合に 無効に一致するという共通の制限がmonth
ありfebruary
ます。If-else 条件は一部の RegEx フレーバーで受け入れられますが、算術演算用のそのような関数は存在しません。遠い将来または近い将来、これはいくつかの RegEx フレーバーで実装される可能性がありますが、これは RegEx が基本的に何であるかには当てはまらないと思います。
28
最初のパターンでは、2 月以降の日付は検出されません。また、無効な日付と一致することはありません。29
です。そして、正規表現を使用してもこの問題を完全に解決できないことはよく知られています。