ホームページ  >  記事  >  バックエンド開発  >  正規表現の基礎を学ぶ

正規表現の基礎を学ぶ

韦小宝
韦小宝オリジナル
2018-03-14 12:52:291345ブラウズ

この記事では JavaScript正規表現 について説明します。JavaScript の正規表現に慣れていない人は、気軽に学習してください。よく知っているので、見てみましょう!

正規表現の学習(継続的に更新)

今日は

JavaScriptを学習しながら、RegExpオブジェクトを学びました。波を学ぶ機会はとても快適です。

参考サイト:

正規表現30分入門クリックしてリンクを開きます

1. 正規表現とは

正規表現とは、

文字列のマッチングを表現するために使用されるルールです。

2. 正規表現の関連概念

2.1

メタキャラクター

メタキャラクターは、正規表現で指定される特殊な記号であり、特定のルールを置き換えるために正規表現に追加されます。

bは、単語の先頭または末尾を表します.は、改行を除く任意の文字を表します* は、*など、*の前に表示される任意の数の文字を表しますは、その前に任意の数の a (0 回以上繰り返される) があることを意味します
+
は、+ の前に任意の数の文字が現れることを意味します。たとえば、 、a+ は、a の前に任意の数字があることを意味します (1 回以上繰り返します)
? 0 回または 1 回繰り返します{n}n回繰り返します{n, }Repeat n 回以上 {n, m} n から m 回繰り返します D
は 0 ~ 9 のデジタルを示します w
マッチレターまたは数字またはアンダースコアまたは漢字ラインブレーク、中国の全幅スペースなど。
文字列の末尾と一致します
^ 文字列の先頭と一致します

3. 単純な正規表現

例から直接開始します:

例 1: hello という単語と一致させたい場合、記述された正規表現 (一致ルール) は次のとおりです: hello

これはすべてに一致します。 helloworld などの hello を含む単語も照合されますが、hello のみに照合したい場合は、メタキャラクター b を使用して hello の前後を区切って、別の単語 hello を形成する必要があります。 は正規表現です。式は次のようになります。 be: bhellob

例 2: 探している hello の後に任意の文字が続く場合、メタ文字と * を使用する必要があります。 正規表現は bhellob.*worldb

の例です。 3: 021-xxxxxxx のような電話番号を一致させたい場合は、021-ddddddd を使用する必要があります。「021-」は特別な意味を示さない単純な文字であり、後で使用される d はメタキャラクターです。この正規表現は 021-d{7} と省略できます。これは、d が 7 回繰り返されることを意味します。

例 4: 1 つ以上の連続する数字と一致する、d+

例 5: a で始まる単語と一致する、baw*b

例 6: 5 ~ 12 桁の QQ 番号と一致する、^d{ 5, 12}&

4. 文字エスケープ

検索したい文字列にメタ文字がある場合は、メタ文字を通常の文字に変換するためにメタ文字の前に追加する必要があります。

5. 文字クラス

このパートで解決される問題は、一致させたい文字に対応するメタ文字がない場合にどうするかということであり、文字クラスを手動で作成する必要があります。

たとえば、0 ~ 9 の数字に一致する d がない場合、0 ~ 9 の任意の数字を見つけたい場合は、[0-9] の文字クラスを作成できます。これは、次とまったく同じ効果があります。 d.

たとえば、正規表現 (?0d{2}[)、-]?d{8} を使用して電話番号を照合できます。順番に説明します。

( はエスケープ (、? は 0 または 1 を繰り返すことを意味します) を意味します。時間、dは2つの数字を表します、[)、-]は)と-の文字クラスを表します、? は、0 または 1 回の後に 8 つの数字が続くことを意味します。

6. 分岐条件

上記

(?0d{2}[), -]?d{8} のような正規表現は (01012345678 または (010-12345678 など) に一致する可能性があります。正しい文字列の場合は、このような状況では、分岐条件を使用できます。分岐条件は、js の論理演算子と似ており、条件が左から右に判断されると終了します。 上記の状況の場合、(0d{2})d{8}|0d{2}-d{8}|(0d{2})d{8}

7 と記述できます。

この部分は、単一の文字ではなく複数の文字が繰り返される問題を解決するためのものです。単一の文字を繰り返す場合、文字 + メタ文字で修飾子を使用できますが、複数の繰り返し文字がある場合は、() を追加できます。たとえば、次の正規表現を使用して IP アドレス

(2[0-4]d|25[0-5]|[01]dd?.){ . 3}(2[0-4]d|25[0-5]|[01]?dd?)

8. 対義語

xxx 以外の文字など、簡単に定義できない文字を検索する必要がある場合は、対義語

string9 .後方参照
W

を使用する必要があります。文字、数字、アンダースコア、または漢字ではありません

D は、数字ではない任意の文字と一致します
B は、単語の先頭または末尾ではない任意の文字と一致します
S は空白以外の文字に一致します
[^x] はS+&以外の文字に一致します

コンテンツのこの部分は前のグループ化と一致します。文字をグループ化した後、() でグループ化する場合は、後でこのグループ化を参照し続けることができます。 ( の出現順に 1 から始まります。たとえば、正規表現 b(w+)s+1b を使用できます。 go go などの繰り返しの単語と一致させるには、ここでは前に出現したグループが 1 を通じて参照されます。 その他の関連する後方参照構文は次のとおりです:

(exp)

match exp 、および現在のコンテンツを自動グループにキャプチャします

expを照合し、現在のコンテンツをキャプチャし、グループ名を割り当てます

(?:exp) exp と一致し、キャプチャされたコンテンツにグループ名を割り当てません

10. ゼロ幅アサーション

は、コンテンツの特定の部分の前後にあるが、そのコンテンツが含まれていない部分を検索するために使用されます。

正規表現(?=exp)とは、後から出てくる部分が式expと一致することを主張することを意味します。たとえば、bw+(?=ingb) は、ing で終わる単語の先頭部分と一致します。例えば、「I'm dance and sing」で検索すると、dance and singがマッチします(w+があるのでsではマッチしません)。

正規表現 (?<=exp) は、前の部分が式 exp と一致する可能性があることを表明することを意味します。たとえば、(?<=bre)w+b は、re で始まる単語の後半に一致します。たとえば、読みを検索する場合は、ading が一致します。

長い数値の 3 桁ごとにカンマを追加する場合、たとえば 123456789 にカンマを追加する場合は、正規表現 ((?<=d)d{3})+b を使用できます。 、検索結果は 234567890 です (検索ルールのこの部分がわかりません...)

次の例では、2 つのアサーションを同時に使用しています (?=

一般に、ゼロ幅アサーションの目的は、特定の規則に従って、一致する文字の開始点または終了点を決定することです。

11. 否定的なゼロ幅アサーション

前述のように、特定の文字ではないもの、または特定の文字内にないものを見つけるには反意語を使用します。

たとえば、文字 q が出現するがその後に u が続かない単語を検索したい場合。 bq[^u]w*b と書くかもしれません。しかし、そのような式の場合、単語の末尾に q が現れるとエラーが発生します。これは、[^u] が単語の区切り文字と一致し、次の単語と一致し、イラク戦闘などの文字と一致するためです。 。 弦。

反意語の占有問題を解決するには、負のゼロ幅アサーションを使用できます。これは、1 つの位置にのみ一致し、文字を消費しないためです。上の式は bq(?!u)w*b と書くことができます。

同様に、exp が前にない文字と一致するには (?

より複雑な例: (?<=<(w+)>).*(?=)

前の内容を参照してください (?< =)とそれに続く (?=) は、前と後ろの両方がゼロ幅のアサーションであり、<(w+)> が HTML タグを表すことがわかります。前のものが の場合、後続のアサーションはゼロ幅になります。アサーションは < ;/h> を意味します (エスケープと後方参照が使用されます)。したがって、この正規表現は HTML タグ間の部分を照合するものです。

12. コメント

には、2[0-4]d(?#200-249) などの構文 (?#comment) によるコメントが含まれます。

13. 貪欲と怠惰

文字列の一致の問題に対処する場合、通常の動作は、できるだけ多くの文字を一致させることです。式 a.*b と文字列 aabab を例にとると、ab ではなく aabab が一致します。この一致ルールは貪欲一致と呼ばれます。

場合によっては、できるだけ少ない文字で遅延マッチングを行う必要があります。この場合、上記の修飾子の後に追加する必要がありますか? 、 a.*?b などの貪欲マッチングは遅延マッチングに変換されます。このとき、aab (文字 1 ~ 3) と ab (文字 4 ~ 5) が一致します (具体的な理由は正規表現の一致ルールに関係します)。 。

14. 処理オプション

jsのフラグと同様に、大文字と小文字を区別しない、複数行モード、グローバルモードなどがあります。

15. バランスのとれたグループ/再帰的マッチング

この部分は、たとえば、数式で (5*3))) をマッチングしたい場合に扱います。単に (. *) として記述することはできず、式全体と一致します。次に、採用すべきマッチング戦略は、これまでに学習したブラケット マッチング問題と同様です。スタックを使用してスタックをポップする場合、最後のスタックが空の場合、これは、スタックを使用して解決します。式内の括弧が完全に一致する場合 空でない場合、正規表現エンジンは括弧を一致させるためにバックトラックします。

関連する推奨事項:

JS で正規表現を使用する方法


以上が正規表現の基礎を学ぶの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。