正規表現―バランスグループを詳しく説明する


この文章はあなたに似合いますか?
この文章の真髄を読むには、原理にあった正しい基礎が必要です。例えば「*?」テキストの内容にマッチする「asp 163」は、正規表現を少し知っている人なら誰でもマッチングできると知っていますが、彼のマッチング過程を知っていますか?もしあなたがよく分からないなら、下の内容はあなたにとってあまり適していないかもしれません。もしかしたら、読みすぎてバランスの使い方が分かりません。したがって、正規表現NFAエンジンの整合原理を先に知ることを提案します。分かりやすい説明を整理するには時間がかかりますが、この内容が予想通りの効果があるかどうかは分かりません。改善していきましょう。
一般正則教程におけるバランス組の紹介
入れ子可能な階層構造にマッチするには、バランスグループを使用します。例を挙げましょう。「xx<bb>ab>aa>yy」という文字列の中で、一番長い括弧内の内容をどうやって捕獲しますか?
ここでは以下の構文構造が必要です。(?<group>) は、キャプチャされたコンテンツをグループと名付け、スタックに押し込む。(?<-group>)は、最終的にスタックに押し込まれたgroupという名前の獲得コンテンツをスタックからイジェクトし、もしスタックがもともと空であったならば、このパケットのマッチングに失敗する。(?(group)yes|no) は、スタック上にgroupというキャプチャされたコンテンツが存在する場合、yes部分にマッチする表現を継続し、そうでなければ、no部分にマッチし続ける。(?!) は、接尾辞表現がないので、常にマッチングを試みています。
もしあなたがプログラマではないなら、上の3つの文法を理解してください。まず黒板に「group」と書いてください。二つ目は黒板から消します。三つ目は黒板に書いてある「group」があるかどうかを見てください。もし続けてマッチングする部分があれば、yesの部分があります。さもないとnoにマッチします。
私達がしなければならないのは左括弧に出会うごとに、黒板に「group」と書いて、右括弧に触れるごとに消して、最後に黒板の上にあるかどうか見てください。もしあれば左括弧が右括弧より多いと証明します。マッチングは失敗するべきです。グループの構文):

<         #       
 [^<>]*     #                 
 (
  (
   (?'Open'<) #      ,       "Open"
   [^<>>]*   #               
  )+
  (
   (?'-Open'>) #      ,    "Open"
   [^<>]*   #              
  )+
 )*
 (?(Open)(?!))  #            ,             "Open";   ,     
>         #       
なぜこの文章を書きますか?
上の紹介を見て分かりましたか?正規表現の原理を理解していない前に、上の平衡グループの紹介を見て、分かるように分かりません。しかもテンプレートとして覚えて、柔軟に使うことができません。したがって、本則に関する資料をたくさん調べて、特にlxcnnの技術文書と「正規表現に精通している」という本に感謝しています。正規表現についてもっと深く、もっと体系的に理解しています。その上、自分の学習経歴を結び付けて、学習ノートとして保存します。これも嬉しいことです。
上記のコードを分析しないで、バランスグループに関する概念と知識を説明します。
以下の表式マッチングテストツールは、エクスプレスであり、当駅もその完璧な解読版のダウンロードを提供します。
バランスグループの概念と役割
バランスグループ、故名思義、平衡は対称で、主にいくつかの正則文法規則を結び付けて、対に出現する入れ子構造に対する整合を提供します。バランスグループは狭義と広義の2つの定義があり、狭義バランスグループは(?Expression)文法を指すが、広義バランスグループは固定的な文法規則ではなく、いくつかの文法規則の総合的な運用であり、私たちが普段言っているバランスグループは一般的に広義バランスグループを指す。本論文では特に示されていないように、平衡グループという簡潔な表現は一般化平衡グループを指す。
バランスグループの整合原理
平衡グループの整合原理はスタックで説明でき、まず例を挙げて、例に基づいて説明します。
ソース文字列:a+(b*(c+d))/e+f-(g/(h-i))*j
正規表現:((?<Open>\()|(?<−Open>)|[^()])*(?(Open)(?!))\)需要説明:ペアに合わせて出現する()の内容
出力:(b*(c+d)) (g/(h-i))上の正規表現コードを支店で書きます。コメントを入れると、階層があり、便利です。

 \(        #    “(”
  (       #    ,      “*”    
   (?<Open>\() #     ,     “Open”   1
   |      #    
   (?<-Open>\)) #     ,     “Open”   1
   |      #    
   [^()]+    #          
  )*       #      0      
  (?(Open)(?!)) #      “Open”,       ,      
 \)       #     
ネストされた構造については、開始と終了の両方が確定しており、この例については「()」から始まり、「()」に終わると、次に中間の構造を調べ、中間の文字は三つの種類に分けられ、一つは「(」、一つは「)」であり、残りはこの2つの文字以外の任意の文字である。
バランスグループの整合原理はこのようなものです。
1、まず最初の「(」を見つけて、マッチングの開始とします。つまり上の1行目は、a+(c+d)/e+f-(g/(h-i)*jとマッチしています。 (赤色表示部)
2、第1ステップ以降に、一つの「(」にマッチするごとに、Openの捕獲グループをスタックに入れ、カウントは1を加算する。
3、第1ステップ以降、一つの「)」にマッチするごとに、スタックの一番近いOpen捕捉グループを出し、カウントを1つ減らす。
つまり、上の第一行の正則が「\(」にマッチしました。a+(b*(c+d))/e+f-(g/(h-i))*j (赤色表示部)
次に、cの前の「(」にマッチし、このとき、カウントは1を加算する。引き続きマッチングし、dの後の「)」にマッチして、1を減算します。注意します。この時、スタックのカウントは0です。正則は前の方にマッチングし続けます。しかし、「」にマッチすると、例えばこの例ではd))、エンジンは(?(Open)(?!))に制御権を渡して、スタックの中は0かどうかを判断します。0なら、「no」にマッチする分岐を実行します。この条件判定構造には「no」の分岐がないので、何もしないで、制御権を次の「\」に渡す。
この正規表現「\」は、次の)にマッチします。すなわち、b)(赤の括弧)
4、後の (?(Open)(?!))は、スタック内のOpen捕捉グループカウントが0であるかどうか、すなわち「(」と「)」がペアで発生することを保証するために使用される。
5、最後の「)」は、マッチングの終了とします。
マッチングプロセス
まず最初の「(」にマッチして、次の二つの場合が発生するまでずっとマッチングします。制御権を(?Open)(?!):
a)スタックのOpenカウントが0になりました。そこで「)」に出会います。
b)文字列の終端にマッチする
このとき、制御権は(?(Open)(?!))に渡され、Openがマッチングしているかどうかを判断します。このとき、0とカウントしてマッチングしていないので、「no」の分岐と一致します。この条件では、構造に「no」の分岐がないと判断しますので、何もしないで、制御権を次の「\」に渡します。
上で会ったのが状況a)であれば、このとき「\」は次の「)」にマッチして成功します。
上の状況b)に遭遇した場合は、「\」が成功するまで遡及します。そうでなければ、表式全体のマッチングに失敗したと報告します。
NETの狭義平衡グループ「(?<Close-Open>Expression)」構造のために、スタック内の獲得グループを動的にカウントし、開始フラグと一致させ、1をカウントし、1を加算し、1をカウントし、1をカウントし、最後にOpenがあるかどうかを判断し、開始フラグと終了フラグがマッチングしないという説明があり、不一致となる。トレースまたは報告のマッチングに失敗しました。ない場合は、開始と終了フラグのペアが表示され、後の表式のマッチングが継続されます。
(?!)」について説明する必要があります。順序否定ループに属し、完全な文法は「(?!Expression)」です。ここでの「Expression」は存在しないので、ここは一つの位置ではないという意味で、常にマッチングを試みても失敗します。Openがペアリングされていないときに、マッチング失敗を報告するのに役立ちます。
例を見てみます。

<table>
<tr>
<td id="td1"> </td>
<td id="td2">
<table>
<tr>
<td>snhame</td>
<td>f</td>
</tr>
</table>
</td>
<td></td>
</tr> </table>
以上は部分的なHTMLコードです。今私達の問題は、その、でも問題が出てきました。私達が抽出したのは私達が欲しい内容ではなくて、

<td id="td2">
<table>
<tr>
<td>snhame</td>
理由も簡単です。一番近いのは彼のタブとマッチしましたが、このラベルはそれではないと分かりません。そうですかシンボルの原因は、私達は彼に無制限に欲張りさせますが、この問題はもっと大きくなりました。何かめちゃくちゃなものが全部合わせられました。

<td id="td2">
<table>
<tr>
<td>snhame</td>
<td>f</td>
</tr>
</td>
<td></td>
この結果は私達が欲しいものでもないです。じゃ私は「バランス組」で解決します。
<td\s*id=「td 2」[^>*』(?mm>)|[\s\S]*(?mm)(?!)
マッチした結果は

<td id="td2">
<table>
<tr>
<td>snhame</td>
<td>f</td>
</tr>
</table>
</td>
<td></td>
これはまさに私たちのほしいものです。
注意してください。このように書き始めました。

<td\s*id="td2"[^>]*>((?<mm><td[^>]*>)+|(?<-mm></td>)|[\s\S])*(?(mm)(?!))</td> 
マッチした結果は

<td id="td2">
<table>
<tr>
<td>snhame</td>
<td>f</td>
</tr>
</table>
</td>
<td></td>
一つの問題
以下のコードは問題として検討するだけです。
テキストの内容:e+f(-(g/(h-i)*j
正規表現:

\(
 (
  (?<mm>\()
  |
  (?<-mm>\))
  |
  .
 )*?
 (?(mm)(?!))
\)
マッチングの結果は:(-(g/(h-i))