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


89

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

私が思いついたのは

\d{4}$

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

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


fwiwこれらの範囲を自動的に作成するnode.jsプロジェクトto-regex-rangeを作成しました。さまざまな年数をテストするために正規表現を生成する必要がある場合は、思ったよりも難しいです。
jonschlinkert 2017年

検証を4桁の年に制限するのはなぜですか?longnow.org
ダンテンプル

回答:


76

次のように開始アンカーを追加する必要があります^

^\d{4}$

正規表現\d{4}$、4桁で終わる文字列と一致します。そのため、のような入力-1234が受け入れられます。

開始アンカーを追加することにより、 、4桁で開始および終了ます。つまり、事実上、4桁のみを含める必要があります。


2
くそー!鉱山は非常に欠陥があったので、受け入れさえしたでしょうwhateverblahblah2323。今、私は少しの学習が危険である理由を理解しました:O
Ranhiru Jude Cooray 2010

62
これは1万年で壊れます。
sferik 2012

16
@sferik:関係ありません。オリジナルのポスターには、4人のキャラクターをチェックしたいと具体的に書かれていました。彼は、10、000年を有効な入力にしたいとは述べていなかったので、受け入れる10000ことはバグになります。
markusk 2015

4
@sferik:プログラムはそれまでに何世紀にもわたってなくなります。そうでなければ、9、000年先を心配するのが一番です。YAGNIの原則に従って、アプローチは有効です。
Phil

182

1000年から2999年

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

1900〜 2099年

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

14
これははるかに優れたソリューションです
mk_89 2012年

10
:私は非キャプチャグループ使用することをお勧めします^(?:19|20)\d{2}$
エルダーAgalarov

2011年から2099年までの4桁の年をどのように検証しますか?
mcquaim 2017年

(19|20)\d{2}生年月日形式を検証するために正規表現に追加するにはどうすればよいですか?これは私の正規表現/^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/です。年が常に4桁で、19 **または20 **で始まることを確認したい
ltdev 2017

^(19 | 2 [0-9])\ d {2} $を1900年から2999
使用

22

この質問に対する「受け入れられた」答えは正しくなく、近視眼的です。

0001有効な年ではないのような文字列と一致するという点で正しくありません。

それはすることが近視であるではない9999てきた上記のいずれかの値に一致するが、我々はすでにの教訓忘れY2Kを?代わりに、正規表現を使用してください。

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

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

^[1-9]\d*$

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

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

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

3
いいえ、そうではないでしょう。しかし、誰か(考古学者?歴史家?)は8000年前の年と一致する必要があるかもしれません。:Dそして、ドク・ブラウンは...それを必要とするかもしれない
ハイメ・

1
これを使用して、範囲を1000〜9999 ^ [1-9] \\ d {3} $に制限しました。これは、データを提供する必要があるアプリケーションが4桁の数字のみを受け入れるためです:(
MatPag 2015年

素晴らしい答え。0年も受け入れるようにすると、次のようになります。^(-?[1-9] \ d * | 0)$
Kosta Kontos 2016

10

これは1900年から2099年まで機能します。

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

2099年にしか行かないように私には見えます。ところで、OPは正の4桁の数字だけを許可する方法を尋ねています。
DeanOC 2015

ああ、2099は私が意味したものです。ありがとう。そして今、私は正の整数の部分を見ます。
jonschlinkert 2015

これらの範囲を自動的に作成するプロジェクトto-regex-rangeを作成しました
jonschlinkert 2015

5

@ r92の回答に基づいて、1970年から2019年まで:

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

あなたの答えは許します197999
avalanche1

そうは思わない...正規表現の最初の部分は、19で始まり、7、8、または9のいずれかで始まり、その後に1つの番号が続く番号と一致します。正規表現で19[789]\d\d\d許可される197999
ルノー2016

1
/(19[789]\d|20[01]\d)/.test(1970324) >> true
avalanche1

はい、1970最後の3つではなく、最初の4つの数字()に一致し(19[789]\d|20[01]\d)[^0-9]ます。それは一致します1970 324が、一致しません1970324
ルノー2016

1
これはファイル名から映画の年を見つけるのに便利だと思いました...この場合は1930年代以降のものが必要です...しかし、ビデオ品質のために最後に追加された1024を除外します
Adrian Hum

2

理論的には、4桁のオプションが正しいです。しかし実際には、1900〜2099の範囲を持つ方が良いかもしれません。

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

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

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


1

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


1

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


これはまさに私が必要としていたものでした。受け入れられた答えは有効なPCREではないようです。
プロメテウス


0

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


0

私は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

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


0

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

こちらもご利用いただけます。

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

彼らは年だけを一致させたいです。さらに、正規表現が一致する00/00/200031/02/1999、さらに多くの誤った日付に一致します。
トト

助けになるかもしれません([0-2] [0-9] | 3 [0-1])\ /([0-1] [0-2])\ /(19 [789] \ d | 20 [01 ] \ d)
RanjeetChouhan19年

(0[1-9]|1[0-2])月のより良い表現がある
EZ-C
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.