正規表現は基本的に文字列を処理するために使用され、それらを使用して文字列に合わせ、抽出、交換するのが非常に便利です。
ただし、正規表現を学ぶことは、貪欲なマッチング、非グリーディのマッチング、サブグループのキャプチャ、非キャプチャのサブグループなど、依然としてやや困難です。
では、正規表現を学ぶための最良の方法は何ですか?正規表現をすばやくマスターする方法は?
私は非常に良いと思う定期的なルールを学ぶ方法をお勧めします: ASTを通して学ぶことです。
正規表現の一致する原理は、パターン文字列をASTに解析し、このASTを使用してターゲット文字列に一致させることです。
パターン文字列のさまざまな情報は、解析後にASTに保存されます。 ASTは抽象的な構文ツリーです。これは、ASTの構造から編成されたツリーです。
正規表現のASTを表示する方法は?
Webサイトastexplorer.netを介して視覚的に表示できます。
パース言語をregexpに切り替えることにより、正規表現のASTを視覚化できます。
前述のように、 ASTは文法に従って組織化された木であるため、さまざまな文法をその構造から簡単に整理できます。
次に、AST:の観点からさまざまな構文を学びましょう
。
3 char、値はそれぞれa、b、cです。タイプは単純です。その後のマッチングは、それぞれASTを横断し、これら3つのキャラクターをそれぞれ一致させることです。
Exec APIを使用してテストしました。
0番目の要素は一致した文字列で、インデックスは一致した文字列の開始インデックスです。入力は入力文字列です。
特殊文字もう一度試してみましょう
。
また、ASTを通して、それらもcharですが、それらのタイプは確かにメタであることを見ることができます。
任意の数字は、 d metacharacterを使用して一致させることができます。
どちらがメタチャーであり、どのものが単純なチャーであるかは、ASTを一目で見ることができます。
Regular は、[] を介して一連の文字を指定することをサポートしています。これは、任意の文字と一致できることを意味します。
また、ASTから、キャラクタークラスの層で包まれていることもわかります。つまり、キャラクターのクラス、つまり、含まれるキャラクターと一致させることができます。
これは実際にテスト中のケースです。
正規表現は、特定の文字が繰り返される回数を指定することをサポートします。
たとえば、/ b {1,3}/平均文字bが1〜3回繰り返されることを意味します。 、/[ABC] {1,3}/は、このA/B/C文字クラスが1〜3回繰り返されることを意味します。
ASTからわかるように、この構文は繰り返しと呼ばれます。
ここでのタイプは、1〜3の範囲です。
正規表現は、1 から無数の回を示す +、0 から無数の回を示す *、0 または 1 回を示す ? など、一部の量指定子の省略形もサポートしています。
それらは異なるタイプの数量詞です:
一部の学生は、ここでの貪欲な属性はどういう意味ですか?
Greedy は貪欲を意味します。この属性は、この繰り返しが貪欲な一致であるか、非貪欲な一致であるかを示します。
数量詞の後に追加すると、貪欲になります。
では、貪欲で非グリーディとはどういう意味ですか?
例を見てみましょう。
デフォルトの繰り返しマッチングは貪欲であり、条件が満たされている限り、引き続き一致し続けるため、ACBACはここで一致させることができます。
Quantifierが非グリーディに切り替えた後、?
これは、ASTを通じて、貪欲で非グレディが繰り返されることを明確にすることができます。
正規表現は、一致した文字列の一部をサブグループに入れることをサポートし、それを()から返します。
ASTを見てください:
対応するASTはグループと呼ばれます。
そして、あなたはそれがキャプチャ属性を持っていることがわかります、それはデフォルトです:
これはどういう意味ですか?
これは、サブグループキャプチャの構文です。
サブグループをキャプチャしたくない場合は、このように書くことができます(?:AAA)
見て、キャプチャは虚偽になりました。
キャプチャと非キャプチャの違いは何ですか?
試してみましょう:
ああ、グループのキャプチャ属性は、抽出するかどうかを表していることがわかります。
ASTから、デフォルトはキャプチャであることがわかります。つまり、サブグループのコンテンツは抽出できます。
私たちはすでにASTを使用して通常の構文を理解していますが、もう少し難しいものを見てみましょ
。特定の文字列の前にあるかどうかを判断するために使用されます。
ASTを介して、この構文はアサーションと呼ばれ、タイプは見た目であることがわかります。
これはどういう意味ですか?なぜこれを書くのですか? /bbb(ccc) /および /bbb(?:ccc) /の違いは何ですか?
試してみましょう:
結果:
/ BBB(CCC) / CCCのサブグループと一致し、デフォルトのサブグループがキャプチャされるため、このサブグループを抽出します。
/bbb(?:ccc)/ は ccc のサブグループに一致しますが、?: を通じてサブグループをキャプチャしないように設定しているため、抽出されません。
/ bbb(?= ccc)/サブグループに一致するCCCは抽出されておらず、それも非獲得であることを示しています。それと?:そのCCCは一致する結果には表示されませんか。
これはLookaheadの主張の性質です。Lookaheadの主張は、特定の文字列の前に特定の文字列が先行することを意味し、対応するサブグループは非キャプチャであり、アサートされた文字列は一致する結果に表示されません。
その文字列が続いていない場合、それは一致しません:
to?
Lookaheadの主張はまだ最初に主張されていますが、Trueの追加の否定的な属性があります。
意味は元々、正面が特定の文字列であることを意味します。
この場合、一致結果はまったく逆になります。
現在、それはその前の特定の文字列ではない場合にのみ一致します。
先行するアサーションがある場合、当然、後続のアサーションがあります。つまり、特定の文字列が続く場合にのみ一致します。
同様に、次のように拒否することもできます。
(?<= aaa)に対応するASTは考えやすいです。
(?<!aaa)に対応するASTは、負の属性を追加することです。
Look-AneadのアサーションとLook-Behindのアサーションは、
理解するのがはるかに難しいです。
多くの人々は、貪欲なマッチング、非グリーディのマッチング、サブグループのキャプチャ、非キャプチャのサブグループ、Lookahead Assertions、Lookbehind Assertionsなどの構文について混乱しています。
ASTを介して通常のルールを学ぶことをお勧めします。
たとえば、AST:
繰り返しの構文(繰り返し)は、デフォルトが貪欲である(貪欲なものです) -Greedyマッチング。
サブグループ構文(グループ)は、デフォルトを抽出するために使用されます(キャプチャは真)。 。
アサーション構文(Assertion)は、ある文字列の前後を表現するもので、それぞれ(?=xxx)と(?<=xxx)という構文で表現できます。否定(ネガティブは真)、これはまったく逆のことを意味します。
さまざまなドキュメントの構文を深く理解しているのでしょうか、それともコンパイラの構文を深く理解しているのでしょうか?
尋ねる必要はありません、それはコンパイラでなければなりません!
その後、文書よりも文法に従って解析された構文ツリーを介して文法を学ぶ方が自然に良いです。
これは、通常の表現にも当てはまります。また、他の文法を学習できる場合は、ドキュメントを読む必要はありません。