問題タブ [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 - VBA: .NET 正規表現バランシング グループと互換性がありませんか?
ExcelスプレッドシートのVBA関数で.NET正規表現バランシンググループを使用できるかどうかを調べています。
ただし、VBA は .NET と互換性がなく、.NET の一部でもないようです。たとえば、ウィキペディアは「VBA は Visual Basic .NET (VB.NET) と互換性がありません」と率直に述べています。
だから、確かに、w/r/t正規表現のバランシンググループ、私はVBAで運が悪いですよね?
.net - 可変長後読みでのグループのバランス調整
TL;DR: .NET の後読み内でキャプチャ (特にバランシング グループ) を使用すると、取得したキャプチャが変更されますが、違いはありません。.NET の後読みが予期した動作を妨げる原因は何ですか?
.NET のバランシング グループをいじる言い訳として、この他の質問に対する答えを見つけようとしていました。ただし、可変長の後読み内でそれらを機能させることはできません。
まず、この特定のソリューションを生産的に使用するつもりはないことに注意してください。それは学術的な理由によるものです。なぜなら、私が気付いていない可変長後読みで何かが起こっていると感じているからです。将来、問題を解決するためにこのようなものを実際に使用する必要がある場合に、それが役立つ可能性があることを知っています.
次の入力を検討してください。
目標は、 が前にある括弧内にあるすべての文字に一致することです (つまり、からまで~
のすべて)。私の試みは、後読みで正しい位置を確認することでした。これにより、 への 1 回の呼び出しですべての文字を取得できます。これが私のパターンです:a
i
Matches
後読みで を見つけようとしてから~(
、名前付きグループ スタックを使用してDepth
不要な開き括弧を数えます。で開いた括弧~(
が決して閉じない限り、後読みは一致するはずです。への閉じ括弧に達した場合、(?<-Depth>...)
はスタックから何もポップできず、後読みは失敗します (つまり、 からのすべての文字に対してj
)。残念ながら、これは機能しません。代わりにa
、b
、c
、e
、f
、g
およびに一致しm
ます。したがって、これらのみ:
これは、以前に行った最高のネストレベルに戻らない限り、単一の括弧を閉じると、後読みは何にも一致しないことを意味するようです。
これは、私の正規表現に奇妙な点があるか、バランス グループを正しく理解していなかったことを意味している可能性があります。しかし、私は後読みなしでこれを試しました。次のように、すべての文字の文字列を作成しました。
そして、それらのそれぞれでこのパターンを使用しました:
そして、必要に応じて、すべてのケースが一致し、とz
の間の文字を置換し、その後のすべてのケースが失敗します。a
i
では、(可変長の) 後読みは、このバランシング グループの使用を破るものでしょうか? 私はこれを一晩中調査しようとしましたが (そして、このようなページを見つけました)、後読みでこれを 1 回も使用する方法を見つけることができませんでした。
また、.NET 正規表現エンジンが .NET 固有の機能を内部でどのように処理するかについての詳細な情報に誰かが私をリンクしてくれたら嬉しいです。この素晴らしい記事を見つけましたが、たとえば、(可変長の) 後読みには入っていないようです。
c# - バランスの取れたグループキャプチャを行う方法は?
このテキスト入力があるとしましょう。
ff 出力を抽出したい:
現在、 msdnに見られるように、バランスのとれたグループ アプローチを使用して、{} グループの内部にあるもののみを抽出できます。パターンは次のとおりです。
出力に R{} と D{} を含める方法を知っている人はいますか?
.net - 単語の可変長後読みと別の単語の可変長負後読みで正規表現を一致させますか?
文字列にA の前のどこかにパターンBが含まれている場合にのみ、パターンAをキャプチャする正規表現があります。
簡単にするために、Aは\b\d{3}\b
(つまり 3 桁の数字)、Bは単語「foo」であるとしましょう。
したがって、私が持っている正規表現は(?<=\b(?:foo)\b.*?)(?<A>\b\d{3}\b)
.
たとえば、文字列の場合
それはキャプチャします
新しい要件があり、パターンCが先行するキャプチャを除外する必要があります。 Cが単語「バー」であるとしましょう。私が構築したいのは、表現する正規表現です
したがって、例の文字列では、キャプチャする必要があります
もちろん、次のようなもの(?<=\b(?:foo)\b.*?)(?<!\b(?:bar)\b.*?)(?<A>\b\d{3}\b)
「バー」の最初の出現後にすべてが除外され、キャプチャが行われるため、機能しません
正規表現(?<=\b(?:foo)\b(?!.*?(?:\bbar\b)).*?)(?<A>\b\d{3}\b)
テスト文字列の最初の「foo」では、常に「bar」がサフィックスとして検出され、キャプチャのみが行われるため、機能しません
これまでのところ、式の条件付きマッチングを使用し、(現在)後読みの内部で .net が右から左に一致してキャプチャすることを知っているため、次の正規表現を作成できました。(?<=(?(C)(?!)| (?:\bfoo\b))(?:(?<!\bbar)\s|(?<C>\bbar\s)|[^\s])*)(?<A>\b\d{3}\b)
これは機能しますが、パターンA、B、およびCは、ここに投稿した例よりもはるかに複雑であるため、複雑すぎます。
この正規表現を単純化することは可能ですか? たぶん、バランシンググループを使用していますか?
c# - バランシング グループを使用した正規表現
次のような特別な表記法で、型名のジェネリック引数 (ジェネリックにすることもできます) をキャプチャする正規表現を記述する必要があります。
型名が[\w.]+
でパラメータが であると仮定し[\w.,\[\]]+
てInt32
、Dictionary[Int32,Int32]
Int32
基本的にはグループスタックのバランスが取れていない場合は何かを取る必要がありますが、その方法がよくわかりません。
UPD
以下の回答は、問題を迅速に解決するのに役立ちました (ただし、適切な検証がなく、深さの制限 = 1 の場合) が、グループの分散を使用してそれを行うことができました:
UPD2 (最後の最適化)