問題タブ [balancing-groups]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - PCRE 再帰正規表現パターンを .NET バランシング グループ定義に変換する
PCRE には再帰パターンと呼ばれる機能があり、ネストされたサブグループの照合に使用できます。たとえば、「文法」について考えてみましょう。
パターンを使用してPCREで実行できます
(テストケースの例: http://www.ideone.com/L4lHE )
一致する必要があります:
abcdefg
abc,def,ghi
abc,,,def
,,,,,,
[abc;]
[a,bc;]
sss[abc;d]
as[abc;d,e]
[abc;d,e][fgh;j,k]
<abc>
[<a>b;<c,d>,<e,f>]
<a,b,c>
<a,bb,c>
<,,,>
<>
<><>
<>,<>
a<<<<>>><a>>
<<<<<>>>><><<<>>>>
<z>[a;b]
<z[a;b]>
[[;];]
[,;,]
[;[;]]
[<[;]>;<[;][;,<[;,]>]>]
一致しない:
<a
bc>
<abc<de>
[a<b;c>;d,e]
[a]
<<<<<>>>><><<<>>>>>
<<<<<>>>><><<<>>>
[abc;def;]
[[;],]
[;,,]
[abc;d,e,f]
[<[;]>;<[;][;,<[;,]>]]>
<z[a;b>]
.NET には再帰パターンはありません。代わりに、単純なネストされたパターンを照合するためのスタックベースの操作用のバランシング グループを提供します。
上記の PCRE パターンを .NET Regex スタイルに変換することは可能ですか?
(はい、これには正規表現を使用しないほうがよいことはわかっています。これは単なる理論上の質問です。)
参考文献
.net - 外側の括弧の間のテキストをキャプチャする正規表現を書く
だから私はこの形式のテキストを含むファイルを解析しようとしています:
より複雑になります。これは、ファイルでも有効です。
したがって、基本的には外部キーのテキストのみをキャプチャしたいと考えています。すべてのテキストが 1 行に収まるとは限りません。値が複数の行にある可能性があります。また、ファイルには複数の項目があります。
これまでの私の正規表現は次のとおりです。
目標は、最初の部分[^\s=]+
を検索したいキーに置き換えるだけで、外側の括弧のテキスト全体を取得することです。
これが問題です。私の正規表現は、キャプチャしたいテキストをキャプチャするだけでなく、正規表現は貪欲であるため、次のグループからのテキストもキャプチャします。最初の閉じ括弧でキャプチャを停止するため、欲張らないようにしても機能しません。
最終的に、次の文字列がある場合
グループを一致させたい
と
今なら合うよ
ちなみに、私はこれを複数行および単一行モードで実行しています。
何か案は?ありがとう!
c# - 貪欲な繰り返しでバランス グループをバックトラックすると、バランスが崩れる可能性があります。
この質問の目的のために一般的に作成された例として、私の意図は、ある数a
の 、次に同じ数b
の 、さらにもう 1 つの に一致させることb
です。
このスニペットに示されている 2 つのパターンを調べます (これも ideone.com にあります)。
2 つのパターンの一致には違いがあることに注意してください。r1
は、バランシング グループ コンストラクトで貪欲な繰り返しを使用し、3a
と 3に一致しますb
が、これは意図したとおりではありません。r2
しぶしぶ繰り返しを使用する は、2a
と 3を与えますがb
、これは意図したとおりです。
これを説明できる唯一の方法は、(?<B-A> b)+
バックトラックが 1 つ少ない に一致する場合b
、スタックからポップしB
ますが、対応してスタックからポップされたものをプッシュバックしないA
ということです。したがって、b
バックトラッキングにより 1 つ少なく一致したとしても、A
スタックは空のままです。r1
これは、どのように一致するかを説明できる唯一の方法ですaaabbb
。
reluctant +?
inを使用しr2
てもこの問題は発生しないことに注意してください。A
私の見方では、貪欲な繰り返しとは異なり、消極的な繰り返しは、いわばスタックへの「ダメージを元に戻す」必要がないためです。対照的に、貪欲な繰り返しは可能な限り多くの「ダメージ」を引き起こしますが、バックトラックはA
スタックに「物事をそのまま残す」ことに失敗します。
これは何が起こったのかについての正しい分析ですか?もしそうなら、これは仕様によるものですか? 基本的には、貪欲な繰り返しでバランシンググループを後戻りすると不均衡が生じる可能性があるため、これはバグとして分類される可能性があるためです (または、少なくとも文書化されていない驚くべき動作)。
regex - 再演習: 階乗
これは、StackOverlow の実験的な新機能です。さまざまな古典的な問題を解決することで、正規表現の筋肉を鍛えます。正しい答えは 1 つではありません。実際、正しい答えが教育的価値を提供する限り、できるだけ多くの正しい答えを収集する必要があります。すべてのフレーバーが受け入れられますが、明確に文書化してください。できるだけ実用的なテストケース/スニペットを提供して、パターンが「機能する」ことを実証します。
正規表現を使用して、数値xが階乗であるかどうかをどのように確認できますか?
おまけ: パターンがx = nと判断できる場合! 、 nも見つけることができますか?
.net - 「{{」と「}}」で囲まれた部分文字列の最長一致を取得するにはどうすればよいですか?
ウィキペディアの API を介して受け取ったウィキテキスト ファイルを解析しようとしていますが、問題はそのテンプレートの一部 (つまり、{{ と }} で囲まれたスニペット) が自動的にウィキテキストに展開されないことです。そのため、記事内でそれらを手動で探す必要があります。ソースを作成し、最終的にそれらを置き換えます。問題は、.NET で正規表現を使用してテキストから一致を取得できるかどうかです。
自分自身をより明確にするために、私が何を意味するかを説明する例を次に示します。
文字列の場合
単一の一致、つまり文字列全体、つまり可能な限り長い一致が存在する必要があります。
一方、この例のような「孤立した」ブレースの場合:
結果は単一の一致になるはずです: {{...}}
誰か私に提案をしてもらえますか? 前もって感謝します。
c# - バランシング グループを使用する正規表現
次のような構文を使用する基本的なテキスト テンプレート エンジンがあります。
解析に使用している正規表現に問題があり、ネストされた IF/ENDIF ブロックが考慮されていません。
私が使用している現在の正規表現は次のとおりです。%IF (?<Name>[\w_]+)(?<Contents>.*?)%ENDIF
これが.NETで「再帰的」正規表現をサポートする推奨される方法であることを理解しているため、キャプチャグループのバランス調整(.NETの正規表現ライブラリの機能)について読んでいます。
私はグループのバランスをとって遊んでいて、これまでのところ次のことを思いつきました:
しかし、これは私が期待するように完全に動作しているわけではありません。たとえば、多くの空のグループをキャプチャしています。ヘルプ?
.net - RegEx Match VB.NET Select Case with no Case Else
CaseElseが含まれていないSelectCaseステートメントを見つける正規表現を探しています。
これが私がこれまでに思いついたものです
これは、ネストされたステートメントがある場合を除いて、完全に機能します。
バランスグループを使おうとすると、次のことが思い浮かびました。
Select Case / End Selectsのバランスの取れたグループを正しく見つけるのはどれですか?しかし、(?
ここにいくつかのサンプルデータがあります:
この場合、OutterにはCase Elseがあるため、内側のSelectCaseと一致する必要があります。
内側にはElseがありますが、外側にはないため、ブロック全体と一致する必要があります。
内側と外側の両方の選択にCaseElseがあるため、一致しないはずです
.net - エスケープ可能な文字列に一致する正規表現?
文字列に一致するようにこの正規表現を書きました:
つまり、引用符で囲まれたテキストです。エスケープもサポートしているので"hello\"world"
、私が望むように、最初の引用符で止まることなく全体が一致します。しかし、二重エスケープを忘れていました。"hello\\"world"
たとえば、無効です。
これはグループのバランス調整で修正できると確信していますが、これまで実際に使用したことはありません。これの書き方わかる人いますか?
.net - 正規表現のある位置で一致する可能性がありますが、別の位置では一致しません (例: 位置 XOR)?
より大きな正規表現でいくつかの部分式を作成しようとしています。各部分式は、入力のある場所または別の場所で何かに一致しますが、両方の場所ではなく、できれば「関心のある領域」ごとに同じ名前のグループを使用します。たとえば、下のイタリック体のボリューム単位と太字の通貨単位を一致させたいと考えています。
- $3.23米ドル/ガロン。
- ガロンで 3.23米ドル
- 4.50カナダドル/ガロン
- 1ガロン@ 3.23米ドル
- 10ガロン。@ $4.50カナダドル
またはより一般的に:
- stuffmorestuff XXXイエトモアスタッフ
- XXXをもっと見る
stuffとmorestuffは部分式の複雑なセットになる可能性があります。
のいくつかの組み合わせを使用して可能かもしれないようです
- グループ スタックのプッシュ/ポップ
- バランス グループ
- 見回す
しかし、どうすればよいかわかりません。それは交互(|
)または異なる表現の複数のパス(同じことになると思います)に帰着しますか?
c# - 正規表現バランシンググループ
文字列のバランス中括弧({})を一致させようとしています。たとえば、次のバランスを取りたいと思います。
私はMSDNからこの正規表現を思いついたが、うまく機能しない。{}のネストされた一致する複数のセットを抽出したいと思います。親の試合にのみ興味があります