正規表現パターン・ライブラリ
60以上のすぐに使える正規表現パターン。検索、コピー、オンラインでテストします。
このライブラリについて
これはカテゴリ別に整理された60以上の一般的に使用される正規表現パターンのキュレーション、検索可能なコレクションです。各パターンには、説明、式自体、一致の例が含まれます。パターンをクリックしてコピーするか、クイックテストパネルを使ってこのページから直接テキストに対して検証します。
すべてはブラウザ内で実行されます · パターンとテストテキストはどこにも送信されません。これらのパターンをJavaScript、Python、PHP、Java、Go、または正規表現をサポートする任意の言語で使用してください。フラグとキャプチャグループによる高度なテストには、正規表現テスター&デバッガーをお試しください。
仕組み
- 閲覧または検索: カテゴリ(検証、抽出、フォーマット)でパターンを閲覧するか、名前またはユースケースで検索します。
- パターンをプレビュー: 各エントリには、正規表現、それがキャプチャするものの説明、一致を含む例の入力、制限が表示されます。
- データでテスト: 自分のテスト文字列を入力して、パターンが期待どおりにキャプチャすることを確認します。
- 使用するためにコピー: コード用にJavaScript、Python、またはPOSIX形式で正規表現パターンをコピーします。
なぜ正規表現ライブラリを使うのか?
正規表現をゼロから書くのは時間がかかりエラーが発生しやすいです。メールの検証、URLのマッチング、電話番号の抽出、クレジットカードの検出、日付の解析、IPアドレスの検証によく必要なパターンには実績のある解決策がありますが、信頼できるバージョンを見つけるには、Stack Overflowを検索し、正確性を評価し、エッジケースを確認する必要があります。このライブラリは、文書化されたエッジケース、既知の制限、具体的なテストケースとともに検証済みのパターンをまとめています。自分で書くより速く、テストせずにランダムなインターネットソースからコピー&ペーストするより信頼性が高いです。
パターンカテゴリ
- 検証, メール、URL、電話番号、クレジットカード、IPアドレス、郵便番号
- 抽出, 日付、通貨、ハッシュタグ、メンション、ドメイン名
- フォーマット, スペースの正規化、数値のフォーマット、スラッグ生成
- セキュリティ, パスワードの強度、SQLインジェクションの検出、XSSパターン
- コード, HTMLタグ、コメント、変数名、CSS値
正規表現はどこから来たのか
「正規集合」という数学的概念は、スティーブン・コール・クリーネが1951年に RAND 研究覚書 Representation of Events in Nerve Nets and Finite Automata で形式化しました。このページの * 演算子は、彼の名誉のために今でも クリーネ・スター と呼ばれています。ケン・トンプソン は、1968年6月の Communications of the ACM の論文 Programming Techniques: Regular Expression Search Algorithm で理論をアルゴリズムに変え、ベル研究所の QED エディタで最初の regex 実装を出荷しました。1973年までに、同じエンジンが ed を動かし、その後 grep(字義通りの展開は「globally search for regular expression and print」)、sed、awk を動かしました。ラリー・ウォール の Perl(1987)、特に Perl 5(1994)は、名前付きグループ、ルックアラウンド、非貪欲量指定子、Unicode 処理を追加し、これらは PCRE として知られる事実上の方言となり、フィリップ・ヘイゼル が 1997 年に C にライブラリとして移植しました。
エンジン方言とそれらの間で変わるもの
JavaScript できれいに動くパターンが Go では静かに失敗し、POSIX では完全に拒否されることがあります。開発者が出会う可能性が最も高い5つの方言:
- POSIX BRE / ERE(IEEE Std 1003.2-1992):標準 Unix システムの
grep、sed、awkの方言。ルックアラウンドなし、名前付きグループなし、Unicode プロパティエスケープなし。BRE はさらに(、)、{、}、|のエスケープを要求します。 - PCRE2(フィリップ・ヘイゼル、1997、現在のメジャーバージョン 10.x):最も機能豊富な方言。ルックアラウンド、名前付きグループ
(?<name>...)、原子グループ、所有量指定子、再帰。PHPpreg_*、Apache、nginx、R で使用されています。 - ECMAScript regex(ECMA-262、regex セクション 22.2):JavaScript 方言。ES2018 は名前付きグループ、後方参照、
s(dotAll)およびu(Unicode)フラグを追加しました。ES2022 はマッチインデックスのためのdフラグを追加しました。ES2024 は集合記法クラスを持つvフラグを追加しました。 - Python
re:PCRE に近いが、名前付きグループには(?P<name>...)を使用(PEP 433)、異なる詳細モードre.Xを持つ。新しいサードパーティモジュールregexは再帰パターンと POSIX 最長マッチセマンティクスを追加します。 - RE2(ラス・コックス、2010):Go の
regexpと Rust のregexクレートの背後にあるエンジン。ルックアラウンドなし、後方参照なし、所有量指定子なし、意図的に。トレードオフ:保証された線形時間、壊滅的バックトラックなし。このライブラリのパターンが(?=...)または\1を使用している場合、Go ではコンパイルされません。
壊滅的バックトラックと ReDoS
主流言語のほとんどの regex エンジン(PCRE、Java、JS V8 / SpiderMonkey / JavaScriptCore、Python re、.NET)は バックトラック エンジンです。(a+)+ のような入れ子になった量指定子を持つパターンがほぼ一致する入力に当たると、エンジンはあきらめる前に指数関数的な数の代替パスを試すことができます。これは 壊滅的バックトラック であり、OWASP がカタログ化した ReDoS(Regular expression Denial of Service)攻撃クラスの基礎です。
Stack Overflow、2016年7月20日: 先頭と末尾の空白をトリムするように設計されたパターンが、20 000 個の連続した空白文字を含む質問本文に適用され、リクエストごとに 11 分の CPU を消費し、サイトを 34 分間応答不能にしました。公式 Stack Status ブログの事後分析は、トリム regex をネイティブ文字列トリムに置き換えることを推奨しました。
Cloudflare、2019年7月2日: 入れ子量指定子パターン .*(?:.*=.*) を含む WAF ルールがグローバルに展開され、すべてのエッジサーバーで 27 分間 CPU を 100% 消費し、公共インターネットの大部分をオフラインにしました。Cloudflare のブログの事後分析は、再発防止のために Rust の regex クレート(RE2 ベースの線形時間エンジン)への切り替えを評価しました。
防御的な教訓:入れ子量指定子を避ける((a+)+、(a*)*、(a|aa)+);攻撃者制御の入力に対する \s+$ スタイルのトリムを避ける;PCRE では原子グループ (?>...) または所有量指定子 a++ を優先する;高スループットサービスでは RE2 ベースのエンジンを検討する。
メール、URL、電話、日付、クレジットカード:regex を使わない場合
メール。RFC 5322(2008年10月)の完全な文法は、約 3 000 文字の regex にコンパイルされます。<input type="email"> 検証のための W3C HTML5 仕様は、はるかに短い「これはもっともらしくメールか」regex を使用しており、これはクライアント側のヒントの正しい出発点です。RFC 6531(2012年2月)は 用户@example.com のような非 ASCII アドレスを許可し、ASCII のみの regex はこれを誤って拒否します。RFC 6532 以降の業界コンセンサス:regex でメールを検証せず、代わりに検証メールを送信する。
URL。RFC 3986(2005年1月)は URI 汎用構文仕様ですが、WHATWG URL Living Standard はブラウザが実際に受け入れるものに一致するように意図的に逸脱しています。簡単な視覚的チェック以上のことには、regex ではなく JavaScript の new URL("...") または Python の urllib.parse を使用してください。
電話番号。ITU-T 勧告 E.164(現在の改訂版 2010 年 11 月)はオプションの + プレフィックスで最大 15 桁を許可しますが、国別ルールは大きく異なります。Google のオープンソースの libphonenumber ライブラリは、すべての地域の国別ルールをエンコードし、唯一の信頼できる国間バリデータです。
日付。^\d{4}-\d{2}-\d{2}$ のような regex は ISO 8601-1:2019 カレンダー形式に一致しますが、2026-02-31 も受け入れます。日付の有効性はパターンマッチではなくカレンダーロジックを必要とします。Date.parse() または日付ライブラリを使用してください。
クレジットカード。regex は桁数と IIN プレフィックスに一致できます(Visa は 4 で始まり、Mastercard は 51-55 または 2221-2720 で、Amex は 34 または 37 で)が、Luhn チェックサム(ハンス・ピーター・ルーン、IBM、1960 年 8 月に付与された米国特許 2,950,048)を検証できません。Luhn は桁ごとの合計を 10 で割った余りを必要とします。
開発者がこのライブラリを使用する一般的な方法
- クライアント側フォームのヒント、regex キャッチはヒントであり、最終的な検証ではないという理解で。
- ログスクレイピング、アプリケーションログからタイムスタンプ、IP、エラーコード、URL をパイプラインに引き出します。
- 一回限りのデータクリーンアップ:空白の正規化、HTML タグのストリップ、日付形式間の変換、タイトルのスラグ化。
- エディタの検索と置換、VS Code、Sublime、vim、IntelliJ で、regex 方言は PCRE に近い。
- ルーターと URL マッチパターン、Express、Flask、FastAPI、Rails で。
- WAF と侵入検知ルール、Cloudflare 2019 インシデントが示したように、ReDoS について極度の注意を払って。
- クイック文字列テスト、このページの下部にあるテストパネルで、パターンをコードにコミットする前に。
よくある間違い
- アンカーを忘れること。
^と$(または PCRE では\Aと\z)なしでは、検証 regex は、パターンが文字列の どこか に現れる場合に一致します。/\d{4}/は「year 2026 was good」に一致しますが、これはほぼ決して望むものではありません。 - 複数のものを横断して
.*を信頼すること。入力<a href="a"><a href="b">上の<a href=".*">は.*が貪欲であるため、両方のタグを横断してキャプチャします。遅延のために.*?を使用するか、それより良い、本物のパーサで解析してください。 - ドットが改行に一致すると仮定すること。デフォルトでは
.は行終端文字を除くすべてに一致します。JS でs(dotAll)フラグを使用するか、Python でre.DOTALL、または PCRE でインライン修飾子(?s)を使用してください。 \wが非 ASCII 文字を含むと仮定すること。ASCII モードでは、\wは[a-zA-Z0-9_]です。JS でuフラグを追加し(ES2018+)、任意の Unicode 文字には\p{L}を使用してください。Python ではre.UNICODEを追加してください(Python 3 ではデフォルト)。- Go での後方参照。Go の
regexpは RE2 であり、コンパイル時に\1を拒否します。エラー「error parsing regexp: invalid escape sequence: \1」は、パターンを非 regex アプローチに分割する必要があることを意味します。 - regex で HTML を解析すること。有名に不可能:HTML は正規言語ではありません。DOM パーサ(ブラウザの組み込み
DOMParser、cheerio、BeautifulSoup、lxml)を使用してください。
その他のよくある質問
なぜ一部のパターンは (...) の代わりに (?:...) を使用するのですか?
(?:...) は 非キャプチャグループ です。繰り返しや交替のためにグループ化しますが、後方参照スロットを割り当てません。より高速で、結果配列の $1、$2 を汚染することを避けます。キャプチャされたテキストを抽出する必要がある場合は (...) を使用し、グループ化のみの場合は (?:...) を使用してください。
最も一般的な regex フラグは何ですか?
i 大文字小文字を区別しない、g グローバル(すべて検索、JS 特有の動作)、m 複数行(^ と $ が行境界に一致するように)、s dotAll(. が改行に一致するように、ES2018+)、u Unicode(ES2015+)、y sticky(ES2015+)、d hasIndices(ES2022+)、v 集合記法クラス(ES2024+)。/pattern/gimsu として組み合わせます。
リテラル特殊文字にどのように一致させますか?
バックスラッシュでエスケープします。リテラルマッチのためにエスケープが必要な regex メタ文字は:. ^ $ * + ? ( ) [ ] { } | \ /。文字クラス [...] 内では、特殊文字のセットがより小さくなります:位置に応じて ] \ ^ - のみエスケープが必要です。
このライブラリのパターンをシェルスクリプトで使用できますか?
はい、注意点付きで。grep はデフォルトで POSIX BRE を使用し、grep -E は ERE を、grep -P は libpcre がリンクされているシステム(GNU grep、Homebrew 付きの macOS grep)で PCRE を使用します。ルックアラウンド、名前付きグループ、または Unicode エスケープを使用するパターンには grep -P または ripgrep(Rust の RE2 ベースエンジンを使用し、ルックアラウンドを拒否)が必要です。
これらのパターンはサーバーに送信されますか?
いいえ。このページのすべての regex、入力するすべての検索、クイックテストパネルでテストするすべての文字列は、ブラウザの JavaScript エンジンで処理されます。ネットワーク呼び出しは行われません。パターンデータ自体は、ページバンドルの静的 JSON ファイルとして出荷されます。確認のために DevTools のネットワークタブを開いてください。