web-dev-qa-db-ja.com

有効な年をテストするための正規表現一致

値を指定して、有効な年であるかどうかを確認するために検証する必要があります。私の基準は単純で、値は4文字の整数でなければなりません。 1000以前の年数は許可されず、5000などの年数も許可されないため、これが最善の解決策ではないことを知っています。この基準は、現在のシナリオに適しています。

私が思いついたのは

\d{4}$

これは機能しますが、負の値も許可します。

正の整数のみが許可されるようにするにはどうすればよいですか?

72

開始アンカーを追加する必要があります^ なので:

^\d{4}$

正規表現\d{4}$は文字列に一致します4桁で終わる。したがって、-1234が受け入れられます。

開始アンカーを追加すると、begin and endの文字列のみが4桁で一致します。つまり、実質的に4桁のみが含まれている必要があります。

69
codaddict

1000年から2999年

^[12][0-9]{3}$

1900-2099の場合

^(19|20)\d{2}$
154
r92

この質問に対する「受け入れられた」答えは、間違っていて近視的です。

有効な年ではない0001などの文字列と一致するという点で間違っています。

notが9999を超える値と一致するという点で近視です。 Y2K ?代わりに、正規表現を使用します。

^[1-9]\d{3,}$

将来の年に加えて、過去の年と一致させる必要がある場合、次の正規表現を使用して任意の正の整数と一致させることができます。

^[1-9]\d*$

過去の日付を期待していなくても、誰かがタイムマシンを発明してソフトウェアを持ち帰りたい場合に備えて、とにかくこの正規表現を使用することができます。

注:この正規表現は、通常は負の整数ではなくBCの指定で表されるため、1年より前の年を含むすべての年に一致します。もちろん、この規則は次の数千年で変更される可能性があるため、最良のオプションは、正または負の整数に次の正規表現を一致させることです。

^-?[1-9]\d*$
21
sferik

これは1900〜2099で機能します。

/(?:(?:19|20)[0-9]{2})/
9
jonschlinkert

1970年から2019年の間、@ r92の回答に基づいて作成します。

(19[789]\d|20[01]\d)
4
Renaud

理論的には、4桁のオプションが適切です。ただし、実際には1900〜2099の範囲を使用する方が適切な場合があります。

さらに、非キャプチャグループである必要があります。多くのコメントと回答は、適切な私見ではないグループ化のキャプチャを提案しています。一致する場合は機能する可能性がありますが、正規表現を使用して一致を抽出する場合は、構文解析のために4桁の数字と2桁(19および20)の数字も抽出します。

これは、非キャプチャグループを使用した完全一致で機能します。

(?:19|20)\d{2}

1
Adil Aliyev

年とともに他の単語を含む文字列で年をテストするには、次の正規表現を使用できます。\ b\d {4}\b

1
Dhyey

つかいます;

^(19|[2-9][0-9])\d{2}$ 

1900〜9999年。

9999以降を心配する必要はありません-A.I.それまでにすべてのプログラミングを行います!!!へへへへ

https://regex101.com/ で正規表現をテストできます

また、非キャプチャグループに関する詳細情報(上記のコメントの1つに記載)はこちら http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm

1
MarcoZen

[^-]\d{4}$のようなsthを使用できます:マイナス記号-が4桁の前になるのを防ぎます。
_^\d{4}$^とともに使用して、文字列の先頭をキャッチすることもできます。実際にシナリオに依存します...

1
PierrOz

この正規表現をJava ^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$で使用します

1900から9999まで動作

0
R2Rivs

これも使用できます。

([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
0
Ranjeet Luhar

/ ^\d {4} $ /これは、文字列が4つの数字のみで構成されているかどうかを確認します。このシナリオでは、年989を入力するために、代わりに0989を指定できます。

0
Dayz

整数を文字列に変換できます。マイナス記号は数字と一致しないため、負の年はありません。

0
Comradin

YYYYまたはYYYYMMDDと一致させる必要がある場合は、次を使用できます。

^((?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(?:0?2(?:29)))|(?:(?:[1-9]\d{3})(?:(?:(?:0?[13578]|1[02])(?:31))|(?:(?:0?[13-9]|1[0-2])(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8])))))|(?:19|20)\d{2})$
0