Regular Expressions
便利な正規表現のショーケース
サーチ…
日付にマッチする
正規表現は日付のマッチングのために設計されていることを忘れないでください。日付が有効であると言うと、多くの例外処理( 閏年の条件を参照)が必要になるため、はるかに複雑な闘争です。
月(1 - 12)とオプションの先行0:
0?[1-9]|1[0-2]
日と一致させるには、オプションの先行0:
0?[1-9]|[12][0-9]|3[01]
そして年を合わせるために(ちょうど1900年から2999年の範囲を想定しましょう):
(?:19|20)[0-9]{2}
セパレータには空白、ダッシュ、スラッシュ、空白などを使用できます。セパレータとして使用できると思われるものは自由に追加してください。
[-\\/ ]?
これですべてを連結して次のようになります:
(0?[1-9]|1[0-2])[-\\/ ]?(0?[1-9]|[12][0-9]|3[01])[-/ ]?(?:19|20)[0-9]{2} // MMDDYYYY
(0?[1-9]|[12][0-9]|3[01])[-\\/ ]?(0?[1-9]|1[0-2])[-/ ]?(?:19|20)[0-9]{2} // DDMMYYYY
(?:19|20)[0-9]{2}[-\\/ ]?(0?[1-9]|1[0-2])[-/ ]?(0?[1-9]|[12][0-9]|3[01]) // YYYYMMDD
ペタンティックにしたい場合は、バックリファレンスを使用して2つのセパレータが同じになるようにすることができます。
(0?[1-9]|1[0-2])([-\\/ ]?)(0?[1-9]|[12][0-9]|3[01])\2(?:19|20)[0-9]{2} // MMDDYYYY
^ refer to [-/ ]
(0?[1-9]|[12][0-9]|3[01])([-\\/ ]?)(0?[1-9]|1[0-2])\2(?:19|20)[0-9]{2} // DDMMYYYY
(?:19|20)[0-9]{2}([-\\/ ]?)(0?[1-9]|1[0-2])\2(0?[1-9]|[12][0-9]|3[01]) // YYYYMMDD
メールアドレスを一致させる
文字列内の電子メールアドレスを照合するのは難しい作業です。RFC2822を定義している仕様が複雑で正規表現として実装するのが難しいためです。なぜ電子メールを正規表現とマッチさせるのが良いのではないかについての詳細は、正規表現を使用しない場合の反パターンの例を参照してください。そのページから注目すべき最も良いアドバイスは、これを実装するためにあなたの好きな言語でピアレビューされた広範なライブラリを使用することです。
電子メールアドレスの形式を検証する
エントリを素早く検証して電子メールのように見えるようにする必要があるときは、それを簡単に保つことが最善の方法です。
^\S{1,}@\S{2,}\.\S{2,}$
その正規表現は、メールアドレスが長さが1より大きい空白で区切られた文字列であることを確認し、その後に@
が続き、aで区切られた長さが2以上の2つの空白以外の文字列が続き.
。それは完璧ではなく、無効なアドレスを(フォーマットに従って)検証するかもしれませんが、最も重要なのは、有効なアドレスを無効にしていないことです。
アドレスが存在することを確認する
電子メールが有効であることを確認する唯一の信頼できる方法は、その存在を確認することです。 VRFY
SMTPコマンドはその目的のために設計されていましたが、悲しいことに、 スパマーに悪用された後はもう使用できなくなりました 。
メールが有効で存在することを確認するための唯一の方法は、実際にそのアドレスに電子メールを送信することです。
巨大な正規表現の代替
しかし、正規表現を使ってアドレス電子メールを検証することは不可能ではありません。唯一の問題は、正規表現が仕様書に近づくほど、それらが大きくなり、結果として、読んで維持することは不可能であるということです。以下に、いくつかのライブラリで使用されているより正確な正規表現の例を示します。
documentation次の正規表現は文書化と学習の目的で与えられているので、コードに貼り付けるのは悪い考えです。代わりに、そのライブラリを直接使用することで、上流のコードとピア開発者が電子メール解析コードを最新の状態に保ち、維持することができます。
Perlアドレスマッチングモジュール
そのような正規表現の最も良い例は、いくつかの言語の標準ライブラリです。たとえば、RFCに基づいて可能な限り正確にしようとするPerlライブラリのRFC::RFC822::Address
モジュールのものがあります。あなたの好奇心のために、文法から生成されたこのURLの正規表現のバージョンを見つけることができます。 この正規表現のコピーは、正規表現の著者からの引用です:
" 私は正規表現[link]を維持していません。すでにPerlモジュールで修正されているバグがあるかもしれません。
.Netアドレスマッチングモジュール
もう一つは、 EmailAddressAttribute
モジュールの .Net標準ライブラリで使用されるものです 。
^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$
しかし、それがもっと短くても、読み込みが容易で保守が容易ではありません。
Rubyアドレスマッチングモジュール
ルビでは、アドレスを一致させるためにrfc822モジュールで正規表現の構成が使用されています。これはきちんとした考えです。バグが見つかった場合、正規表現の部分を変更して修正する方が簡単です。
Pythonアドレスマッチングモジュール
反例として、python 電子メール解析モジュールは正規表現を使用せず、代わりにパーサーを使用して実装します。
電話番号を一致させる
接頭辞コード(a +
または(00)、次に1から1939までの数字、およびオプションのスペースと一致させる方法は次のとおりです)。
これは有効なプレフィックスを検索するのではなく、プレフィックスである可能性があります。プレフィックスの完全なリストを見る
(?:00|\+)?[0-9]{4}
次に、電話番号の長さが最大15文字であるため、14桁まで検索できます。
接頭辞には少なくとも1桁が費やされます
[0-9]{1,14}
数字にはスペース、ドット、またはダッシュが含まれ、2または3でグループ化できます。
(?:[ .-][0-9]{3}){1,5}
オプションの接頭辞:
(?:(?:00|\+)?[0-9]{4})?(?:[ .-][0-9]{3}){1,5}
特定の国のフォーマットに一致させたい場合は、この検索クエリを使用して国を追加することができます。質問にはすでに質問があります。
IPアドレスに一致する
IPv4
IPv4アドレス形式に一致させるには、番号[0-9]{1,3}
をピリオドで区切って3回{3}
チェックする必要があります\.
別の番号で終わります。
^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$
この正規表現は単純すぎます。正確にしたい場合は、数字が0
から255
間であることを確認する必要があります。上の正規表現は任意の位置で444
を受け取ります。 25[0-5]
、または他の200の値2[0-4][0-9]
、または[01]?[0-9][0-9]
で100以下の値を持つ250-255を確認したい[01]?[0-9][0-9]
。その後にピリオドが付いていることを確認したい\.
{3}
3回、次に1回の期間なし。
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
IPv6
(IPv6アドレスは、コロンで区切られた8 16ビット六角言葉の形取る:
)文字が。この例では、7つの単語とそれに続くコロンとそれに続くコロンを確認します。単語がゼロをリードしている場合、彼らはそれぞれの単語が1と4進数字の間で含まれていてもよい意味、切り捨てられることがあります 。
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
しかし、これは不十分です。 IPv6アドレスはかなり「語彙的」になる可能性があるため、標準ではゼロのみの単語を::
に置き換えることができます。これは、そうでなければ不確定であるため、アドレス内で1回だけ(1〜7の連続した単語の間)行うことができます。これはいくつかの(むしろ厄介な)バリエーションを生成します:
^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$
^[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$
^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:)?[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}::[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}::$
さて、それをまとめて(交互に使用すると)、次のようになります。
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|
^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|
^[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$|
^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:)?[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}::[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}::$
それはマルチラインモードでコメントを重ねて書くようにしてください。だから、これが意味することを理解することが必然的に必要な人は誰でも、鈍いオブジェクトであなたを追いかけることはありません。
12時間24時間の時間ストリングを検証する
12時間形式の場合、次のものを使用できます。
^(?:0?[0-9]|1[0-2])[-:][0-5][0-9]\s*[ap]m$
どこで
-
(?:0?[0-9]|1[0-2])
は時間 -
[-:]
はセパレータであり、必要に応じて調整することができます -
[0-5][0-9]
は分です -
\s*[ap]m
は任意の数の空白文字が続き、am
またはpm
秒が必要な場合:
^(?:0?[0-9]|1[0-2])[-:][0-5][0-9][-:][0-5][0-9]\s*[ap]m$
24時間形式の場合:
^(?:[01][0-9]|2[0-3])[-:h][0-5][0-9]$
場所:
-
(?:[01][0-9]|2[0-3])
は時間 -
[-:h]
必要に応じて調整できるセパレータ -
[0-5][0-9]
は分です
秒で:
^(?:[01][0-9]|2[0-3])[-:h][0-5][0-9][-:m][0-5][0-9]$
ここで、 [-:m]
は2番目の区切り記号で、 h
を時間で置き換え、 m
を分で置き換えます。 [0-5][0-9]
は秒です。
イギリスの郵便番号と一致
英国のポストコードに一致する正規表現
フォーマットは次のようになります。ここで、Aは文字、9桁を表します。
フォーマット | カバレッジ | 例 |
---|---|---|
細胞 | 細胞 | |
AA9A 9AA | WCポストコード領域。 EC1-EC4、NW1W、SE1P、SW1 | EC1A 1BB |
A9A 9AA | E1W、N1C、N1P | W1A 0AX |
A9 9AA、A99 9AA | B、E、G、L、M、N、S、W | M1 1AE、B33 8TH |
AA9 9AA、AA99 9AA | 他のすべてのポストコード | CR2 6XH、DN55 1PT |
(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})
どこで最初の部分:
(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))
二番目:
[0-9][A-Z-[CIKMOV]]{2})