
キーテイクアウト
- 正規表現(REGEX)は、ログ分析、フォームの提出検証、操作の検索と交換などのタスクに使用される開発者にとって貴重なツールです。正規表現を効果的に構築および使用する方法を理解することで、生産性と効率を大幅に向上させることができます。
優れた正規表現の構築には、シナリオの定義、計画の開発、実装/テスト/リファクタリングが含まれます。許可されているキャラクターの種類、キャラクターが何回表示する必要があるか、従うべき制約を理解することが重要です。
- 正規表現の実用的な例には、パスワード、URL、特定のHTMLタグ、重複した単語の一致が含まれます。これらの例は、キャラクターの範囲、主張、条件、グループなどの使用を示しています。
Regexは強力なツールですが、複雑で管理が困難な場合もあります。したがって、1つの大きなものではなく、いくつかの小さな正規表現を使用する方が効果的な場合があります。グループキャプチャに注意を払うことは、さらに処理するために一致をより便利にすることもできます。
-
正規表現は、検索を実行し、サブストリングを交換し、文字列データを検証するためによく使用されます。この記事では、複雑な正規表現を通過するためのヒント、トリック、リソース、およびステップを提供します。
ベルトの下に基本的なスキルセットがない場合は、初心者向けガイドでRegexを学ぶことができます。正規表現のように不可解なように、概念を学ぶのにそれほど時間はかかりません。
定期的な表現を説明する本、記事、ウェブサイトがたくさんあるので、別の説明を書く代わりに、より実用的な例にまっすぐに行きたいと思います。
パスワードの一致-
url
の一致
特定のHTMLタグの一致-
- 複製された単語の一致
-
このリンクで便利なチートシートを見つけることができます。多くの有用なリソースに加えて、この投稿の下部にLea Verouによる会議ビデオもあります。少し長いですが、Regexを分解するのに最適です。
優れたregexを構築する方法-
定期的な表現は、開発者の日常生活でよく使用されます - ログ分析、フォームの提出検証、検索と交換など。だからこそ、すべての優れた開発者はそれらの使用方法を知っている必要がありますが、優れたregexを構築するためのベストプラクティスは何ですか?
1。シナリオを定義します
自然言語を使用して問題を定義することで、使用するアプローチのより良いアイデアが得られます。定義で使用される言葉は、必須の制約またはアサーションを説明するのに役立ちます。
以下は例です:
文字列は「H」で開始し、「o」で終了する必要があります(Hello、Haloなど)。
文字列は括弧で巻き付けられる可能性があります。
- 2。計画を作成します
問題の適切な定義があった後、私たちの正規表現に関与している種類の要素を理解できます。
-
許可されている文字の種類は何ですか(単語、数字、新しいライン、範囲、…)?
キャラクターが何回現れる必要があります(1つ以上、1回、…)?
従うべきいくつかの制約がありますか(オプション、lookahead/後ろ、if-then-else、…)?
3。実装/テスト/リファクタリング
正規表現をテストおよび改善するために、リアルタイムのテスト環境を用意することが非常に重要です。 Regex101.com、Regexr.com、Debuggex.comなどのWebサイトがあり、最高の環境を提供しています。
正規表現の効率を向上させるために、これらの追加の質問のいくつかに答えることができます。
- 特定のドメインに対してキャラクタークラスは正しく定義されていますか?
- より多くのユースケースをカバーするために、より多くのテスト文字列を書く必要がありますか?
- いくつかの問題を見つけて分離し、それらを個別にテストすることは可能ですか?
実用的な例
次の例の目標は、問題を解決するだけの表現を書くことではなく、文字範囲、アサーション、条件、グループなどなどの重要な要素を使用して、特定のユースケースに対して最も効果的な表現を書くことです。
パスワードの一致
シナリオ:

6〜12文字の長さ
- 少なくとも1つの大文字
が必要です
- 少なくとも1つの小文字
が必要です
- 少なくとも1桁の
が必要です
- 他の文字を含める必要があります
-
パターン:
^(?=。*[a-z])(?=。*[a-z])(?=。*d)。{6,12} $
この式は、複数のポジティブルックヘッド(?=(regex))に基づいています。 Lookaheadは、宣言された(Regex)が続く何かと一致します。条件の順序は結果に影響しません。ルックアラウンド式は、いくつかの条件がある場合に非常に便利です。
また、ネガティブLookahead(?!(Regex))を使用して、いくつかの文字範囲を除外することもできます。たとえば、%を(?!。*#)で除外できます。
上記の式の各パターンを説明しましょう。
^文字列の開始時に位置をアサートします
- (?=。*[a-z])ポジティブな見た目は、regex。*[a-z]が一致できると主張しています。
- 。
[a-z]は、aとzの間の範囲の単一文字と一致します(ケースに敏感)-
-
(?=。*[a-z])ポジティブな見た目は、regex。*[a-z]が一致できると主張しています。
。
- [a-z]は、aとzの間の単一の文字と一致します(ケースに敏感)
-
- (?=。 *d)肯定的な見た目は、regex *dcanが一致すると主張しています。
。
d桁[0-9]- に一致します
-
。{6,12}6〜12回のキャラクター(newlineを除く)に一致します
- $文字列の終わりに位置をアサートします
url
の一致

シナリオ:
- httpまたはhttpsまたはftpで開始する必要があります。
有効なドメイン名- と一致する必要があります
ポート仕様(http://www.sitepoint.com:80)- を含めることができます
桁、文字、ドット、ハイフン、フォワードスラッシュ、複数回- を含めることができます
パターン:
^(http | https | ftp):[/] {2}([a-za-z0-9-。]。[a-za-z] {2,4})(:[0-9])? /?([a-za-z0-9 -._?、 '/\&%$#=〜]*)
最初のシナリオは、 ^(http | https | ftp):[/] {2}で解くのが非常に簡単です。
ドメイン名を一致させるには、有効であるためには文字、数字、ハイフン、ドットのみを含めることができることに留意する必要があります。私の例では、句読点後の文字の数を2から4に制限しましたが、.rocksや.codesなどの新しいドメインの場合は拡張できます。ドメイン名は([a-za-z0-9-。]。[a-za-z] {2,4})によって一致します。
オプションのポート仕様は、単純な(:[0-9])?
URLには複数のスラッシュと複数の文字が何度も繰り返されることができます(RFC3986を参照)。これは、グループ内のさまざまな文字を使用することで一致します([a-za-z0-9 -._?、 '/\&%$ $ #=〜]*)。
すべての重要な要素をグループCapture()と一致させることは本当に便利です。これは、必要な試合のみを返すためです。特定のキャラクターを逃れる必要があることを忘れないでください。
以下では、すべてのサブパターンが説明しました:
^文字列の開始時に位置をアサートします-
グループ(http | https | ftp)をキャプチャし、httpまたはhttpsまたはftp- をキャプチャします
:キャラクターを逃れ、キャラクターに一致します:文字通り-
[ /] {2}は、脱出された文字 /- の正確に2倍に一致します
グループ([a-za-z0-9-。]。[a-za-z] {2,4}):
-
[a-za-z0-9-。]は、文字通り、文字通り、z、aとz、0と9の範囲の1つと無制限のキャラクターと一致します。文字通り-
。キャラクターに一致します。文字通り-
[a-za-z] {2,4}aとzまたはaとzの間で2〜4回の単一文字を一致させます(ケースに敏感)
- グループのキャプチャ(:[0-9])?:
- Quantifier?ゼロ以上の間のグループを一致させます
- :キャラクターに一致します:文字通り
- [0-9]は、0〜9の間の単一文字と一致します
- /?文字通りゼロまたは1回のキャラクターに一致します
- グループ([a-za-z0-9 -._?、 '/\&%$#=〜]*):):
- [a-za-z0-9 -._?、 '/\&%$#=〜]*ゼロと無制限の時間を一致させます。 :-._?、 '/&%$#=〜。
HTMLタグの一致

シナリオ:
- startタグは、
で終了する必要があります。
- endタグは 1つ以上の文字が続き、>
で終了する必要があります
- タグ要素内のコンテンツを一致させる必要があります
パターン:
(。*?)1>
開始タグと内部のコンテンツを一致させると、 and(。*?)で非常に簡単ですが、上記のパターンでは、有用なものを追加しました。キャプチャグループへの参照です。
括弧()で定義されたすべてのキャプチャグループは、その位置番号(最初)(2番目)(3番目)を使用して参照できます。これにより、さらなる操作が可能になります。
上記の式は次のように説明できます。
- で開始します
- タグ名をキャプチャ
- 1つ以上のchars
が続きます
- タグ内のコンテンツをキャプチャ
- 閉じるタグはタグ名>
の前にキャプチャされなければなりません
式には、タグ名とコンテンツの2つのキャプチャグループのみが含まれ、関連するコンテンツを持つタグ名のリストである非常に明確な一致を返します。
もう少し深く掘り下げて、サブパターンを説明しましょう。
- に一致します
- グループ([w])キャプチャグループは、単語文字A-ZA-Z0-9_ 1回以上一致します
- 。
>文字通り>文字通り- に一致します
グループ(。*?)をキャプチャし、キャラクター(newlineを除く)、ゼロ、およびその他の時間を一致させます-
に一致します
/文字通り- に一致します
1は、最初のキャプチャグループと一致する同じテキストと一致します:([w])-
>文字通り>文字通り- に一致します
複製された単語の一致
シナリオ:
単語は空間分離- です
すべての複製と一致する必要があります。
パターン:
b(w)b(?=。*1)
この正規表現は挑戦的なようですが、以前に示された概念の一部を使用しています。
このパターンは、単語の境界の概念を導入します。
単語の境界bは主に位置をチェックします。単語文字(つまり:abcde)の後に非単語文字(つまり:-〜、!)が続く場合に一致します。
以下に、単語の境界の使用例をいくつか見せて、それを明確にすることができます。
- フレーズを考えると、正規表現は素晴らしいです
- パターンベアブマッチはです
- パターンw {3} bは、単語の最後の3文字に一致する可能性があります:lar、ion、are、ome
上記の式は次のように説明できます。
- すべての単語文字に続いて、単語以外の文字が続きます(私たちのケーススペース)
- 一致した単語がすでに存在しているかどうかを確認してください
以下に、各サブパターンの説明があります。
- bワード境界
- グループ([w])は、任意の単語文字a-za-z0-9_
任意の単語と一致します
- bワード境界
- (?=。*1)肯定的なLookaheadは、以下と一致できると主張しています。
-
1は、グループを最初にキャプチャするのと同じテキストと一致します-
最初のマッチのみを返すのではなく、すべてのマッチを返す場合、表現はより理にかなっています。詳細については、PHP関数preg_match_allを参照してください。
最終的な考え
正規表現は両刃の剣です。複雑さが増すほど、問題を解決することがより困難になります。そのため、すべてのケースに一致する正規表現を見つけるのが難しい場合があり、代わりにいくつかの小さな正規表現を使用する方が良いでしょう。
問題の優れたシナリオを持つことは非常に役立つ可能性があり、キャラクターの範囲、制約、アサーション、繰り返し、オプションの値などを考え始めることができます。グループキャプチャにより多くの注意を払うことで、さらなる処理にマッチが役立ちます。例の表現を自由に改善して、あなたのやり方を教えてください!
有用なリソース
以下に、REGEXスキルの成長を支援するためのさらなる情報とリソースをご覧ください。
リストされていない便利なものが見つかった場合は、記事にコメントを追加してください。
lea verou - /reg(exp){2}貸し出し/:正規表現を分裂させる
https://www.youtube.com/watch?v=eklues9rvak
phpライブラリ
name |
説明 |
regexpbuilder
方法の人間が読みやすいチェーンを使用して、正規表現を作成します
NOONOOFLUENTREGEX
流fluentセッターと上記のような英語用語を使用して、正規表現を構築します
HoareGex
正規表現を分析し、文字列を生成するためのツールを提供します
正規表現逆
正規表現が与えられた場合、文字列が生成されます
ウェブサイト
url |
説明 |
regex101.com
PCRE Online Regex Tester
regextester.com
PCRE Online Regex Tester
rexv.org
PCRE Online Regex Tester
debuggex.com
PCREをサポートし、非常に便利な視覚的なRegexデバッガーを提供します
regexper.com
JavaScriptスタイルのRegexですが、デバッグに役立ちます
phpliveregex.com
PREG機能のオンラインテスター
regxlib.com
使用できる正規表現のデータベース
regular-Expressions.info
正規表現チュートリアル、書籍のレビュー、例
books
タイトル |
説明 |
著者 |
編集者 |
正規表現のマスター
正規表現の本が必要です
ジェフリー・フリードル
オライリー
正規表現ポケットリファレンス
Perl、Ruby、PHP、Python、C、Java、および.Netの正規表現
トニースタブビン
オライリー
正規表現(regex)
に関するよくある質問(FAQ)
正規表現(regex)の実用的なアプリケーションは何ですか?
正規表現(regex)は非常に用途が広く、さまざまな実用的なアプリケーションで使用できます。これらは、ユーザー入力が電子メールアドレスや電話番号などの特定の形式と一致するようにするために、データ検証で一般的に使用されています。また、Webスクレイピングで使用して、Webページから特定の情報を抽出することもできます。さらに、テキストの特定の文字列を見つけて交換したり、文字列を一連のサブストリングに分割したりするなどのタスクのテキスト処理では、正規表現を使用できます。 ?
複雑な正規表現の作成には、さまざまなregexコンポーネントの理解と組み合わせが含まれます。これらには、リテラル、キャラクタークラス、数量詞、およびメタカラクターが含まれます。これらのコンポーネントをさまざまな方法で組み合わせることにより、さまざまなパターンに一致する正規表現を作成できます。たとえば、メールアドレス、電話番号、またはURLに一致する正規表現を作成できます。
正規表現(regex)を使用するときに避けるべきいくつかの一般的な間違いは何ですか?
正規表現を使用する際に避けるための一般的な間違いは、DOT(。)やアスタリスクなどの特定のコンポーネントの過剰使用または誤用を含む(。 *)、これは予期しない結果につながる可能性があります。別の一般的な間違いは、文字通り解釈されることを意図している場合、特殊文字を適切に逃れないことです。さらに、正規表現はデフォルトではケースに敏感であることを覚えておくことが重要です。そのため、ケースを無視する場合は、適切なフラグを使用する必要があります。 >
正規表現をテストできるオンラインツールがいくつかあります。これらのツールは通常、正規表現とテスト文字列を入力することができ、次に正規表現に一致するテスト文字列の部分を強調表示します。これは、通常の表現をデバッグし、予想どおりに機能していることを確認するための優れた方法です。
正規表現(regex)はすべてのプログラミング言語で使用できますか?何らかの形の表現。ただし、サポートされている特定の構文と機能は、言語によって異なります。たとえば、JavaScript、Python、およびRubyはすべて正規表現をサポートしていますが、それぞれ独自の構文と機能があります。正規表現は非常に強力ですが、適切に使用されないとリソース集約型になることもあります。複雑な正規表現は、特に大きなテキストの文字列で実行に長い時間がかかる場合があります。したがって、正規表現を慎重に使用し、できるだけそれらを最適化することが重要です。
正規表現(regex)を最適化するにはどうすればよいですか?
正規表現(regex)を使用して、HTMLまたはXML?
正規表現を使用することはできますが、正規表現を使用することは可能ですが、 HTMLまたはXMLを解析するには、通常はお勧めしません。これは、HTMLとXMLには、正規表現で正確にキャプチャするのが難しいネスト構造があるためです。代わりに、通常、専用のHTMLまたはXMLパーサーを使用することをお勧めします。正規表現(regex)の代替品は何ですか?
正規表現は非常に強力ですが、それらは常に仕事に最適なツールではありません。手元のタスクに応じて、別のアプローチを使用する方が良いかもしれません。たとえば、単純な文字列操作タスクの場合、正規表現の代わりに組み込みの文字列メソッドを使用できる場合があります。 HTMLまたはXMLを解析するには、通常、専用のパーサーを使用します。複雑なテキスト処理タスクについては、自然言語処理ライブラリの使用を検討することをお勧めします。
以上が実用的な例を使用して、正規表現を測定しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。