Regex チートシート: パターン、フラッグ、実用的な例
文字クラス、定量表記、アンカー、グループ、見回し、フラグ、日常作業用のテストパターンを備えた実用的な正規表現のチートシートです
· 7 分で読めます
規則式はテキストを記述するためのコンパクトな言語です。単行本で入力を検証したりログからデータを抽出したり何百ものファイルの名前を改名したりできます。細かい間違いがほぼ機能するパターンを生み出すのです。このチートシートでは毎日使う構文を集め人を引っ張る部分を説明し適応できる試されたパターンで締めくくります。Python、Java、Go、NET に非常に近い。この例では、JavaScriptの文法が
読みながら [regex tester] ((/tools/regex-tester) で各パターンを試してください。突出されたマッチを見て、直感を確立する最速の方法です。
文字どおりの文字と逃亡
catは"猫"と一致する。12文字は特別な意味を持ち文字が文字通り一致するように逆斜線で逃れなければなりません
. * + ? ^ $ { } ( ) | [ ] \ /
3.14は"3.14"と一致し "3x14"と一致し 3\.14は"3.14"と一致します
キャラクタークラス
| パターン | マッチ |
|---|---|
. |
新行以外の文字 (sフラグが設定されていない場合を除く) |
\d |
09という数字 |
\w |
文字文字:文字、数字、下記 |
\s |
白いスペース:スペース、タブ、新行 |
\D, \W, \S |
上記の逆 |
[abc] |
A、b、c のいずれか |
[a-z] |
小文字の ASCII 文字 |
[^0-9] |
数字でない文字 |
\p{L} |
どんな文字でも (uフラグが必要です) |
括弧の内側ではほとんどの特殊文字が意味を失います。[.]は文字どおりのドットと一致します。文字列は文字列で [-a-z] は文字列です
定量表
| パターン | 意味 |
|---|---|
a* |
ゼロ以上 |
a+ |
1つ以上 |
a? |
0か1か (オプション) |
a{3} |
正確に3人 |
a{2,5} |
2時から5時まで |
a{2,} |
2つ以上 |
量表は利己的なものでできるだけ一致して逆転します。?を足せば、彼らは怠け者になる。<b>bold</b> が与えられれば <.+> のパターンは文字列全体に一致し、<.+?> は <b> にのみ一致する。
アンカーと境界線
^は文字列の始まり、またはmフラグの各行に一致します。$は文字列の終わりに一致しますmは各行に一致します\bは文字の境界:文字文字と文字以外の文字の間の位置に一致します。
\bcat\bは"猫が座った"の "猫"と一致しますが"連鎖"では違います。アンカーは検証に不可欠です: \d{5}は"abc123456"のどこでも5桁を見つけます。^\d{5}$では、すべての入力が正確に5桁である必要があります。
グループと交代
(abc)グループと捕獲。文字は$1と$2の代替形式で入手できます。(?:abc)は捕捉せずにグループ化しますこれは速く番号をきれいにします(?<year>\d{4})は名前付きグループで、match.groups.yearとしてアクセスできます。a|bはAとBに一致します。^cat|dog$は"猫から始まる" "犬で終わる"という意味です。^(?:cat|dog)$を使って単語の1つに一致します\1はグループ1のバックレファレンスです(\w)\1は"hello"で"ll"のような二重文字を見つけます
周りを見回して
文字を使わずに、何かが現在の位置の隣にあるか、ないかを主張する。
| パターン | 意味 |
|---|---|
(?=...) |
ポジティブな見込み: に続く |
(?!...) |
負の目線: その後に |
(?<=...) |
ポジティブ・バック・ラック: 前記: |
(?<!...) |
ネガティブ・バック・ルーク: 前者: |
例:\d+(?=px)は"px"なしの"16px"の数字に一致する.(?<=\$)\d+はドル記号の後に付いた金額に一致する.^(?!.*password).*$は"パスワード"を含まない行に一致する。
旗
g(グローバル):最初の1つで停止するのではなく、すべてのマッチを見つけます。i(小数)aは"A"と一致するm(多行線):^と$が線断時に一致する。s(dotAll):.もニューラインに一致する。u(ユニコード): イモージーなどの代用ペアを単一の文字として処理し、\p{...}を有効にします。y(粘着): 最後の試合が終わった位置での試合のみ。
日常作業のパターン
実践的な方法であるのではありません。実際の検証はサーバー側によるチェックと組み合わせられるべきです。
**メール (実用的な) **
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
@やドメインが欠落しているようなタイプエラーを検出します.唯一の真の検証は確認メールを送信することです。
URLスラグ:
^[a-z0-9]+(?:-[a-z0-9]+)*$
ISO日付 (YYYY-MM-DD):
^(?<year>\d{4})-(?<month>0[1-9]|1[0-2])-(?<day>0[1-9]|[12]\d|3[01])$
形式と範囲が確認されますが 2月31日があるかどうか確認できません。確認するには日付を解析します。
ヘックスの色:
^#(?:[0-9a-fA-F]{3}){1,2}$
IPv4アドレス:
^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)$
セマンティック・バージョン:
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?$
** 強力なパスワードチェック** (少なくとも12文字、小文字1文字、大文字1文字,1桁):
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$
空白をカットする: ^\s+|\s+$ (gで) を空の文字列で置き換える。
複製スペースを崩壊させる: {2,} を単一のスペースに置き換える。
ログ行からキー=値ペアを抽出する:
(\w+)=("[^"]*"|\S+)
camelCase to snake_case: ([a-z0-9])([A-Z]) を $1_$2 で置き換えて、結果を小文字にする。命名スタイルについては [camelCase vs snake_case] (ブログ/命名慣例-camelcase-snake-case) をご覧ください。
性能と壊滅的なバックトラッキング
JavaScript、Python、Javaの Regex エンジンはバックトラッキングを使用します。あるパターンはエンジンを動力的に組み合わせを数値的に試すようにします。典型的な例は"^(a+)+$"対"aaaaaaaaaaaaaaaaaaa!"です。"A"が多ければ作業が倍になり数十文字でサーバーが凍結しますこれはReDoSとして知られるサービス拒否ベクトルです
予防するには
(a+)+や(\w*)*のように、同じ文字の上に定量値を入れないでください。(a|ab)*はリスクが高いので再構築しましょう.*より特定のクラスを好む:"[^"]*"は".*?"よりも安全で速く- 信頼されていないデータとマッチする前に入力長さを制限する。
読解性のヒント
- 複雑なパターンを段階的に作って各パーツをテストします
m[2]ではなくm.groups.monthを読みます。- 複雑なパターンをコードでコメントしたり小さな文字列から構築したりします
- 小さなパーサーがより明確になるか検討してくださいパーサーは、小さなパーサーを
まとめ
クラスを、定量化符、アンカー、グループ、フラグを学ぶと、出会うほとんどのリジェクスを読むことができます。意図的に怠け者の量表やアンカーを使用し文脈を消費することなく状況を探し回し嵌入された量表を注意しパターンを送信する前に常に一致する例と一致しない例の両方をテストします
このページは英語から自動翻訳されています。誤りを見つけた場合はお知らせください。