5

私は非常に簡単な問題を抱えています。

この正規表現を使用して、のインスタンスを照合しています{somestring}

\{{1}(\w+?)\}{1}

問題は、のインスタンスを無視するために必要なことです{{somestring}}が、もちろん、の内部と一致してい{somestring}ます{{somestring}}

式を微調整して次のようなものをスキップする方法はあり{{somestring}}ますか?

vbscriptの正規表現エンジンを使用しています。

4

3 に答える 3

5

正規表現エンジンがルックアラウンドをサポートしている場合は、次の方法があります。

(?<!\{)\{\w+\}(?!\})

これは文字通りあなたが望むことをします。後読みは、{あなたの前に何もない{と主張し、先読みは、あなたの}後に続くものがないと主張します}

{1}それは何もしないことに注意してください。これまで。

また、とにかく\w+消費することができないので、貪欲にする必要はないことに注意してください。}

最後に、ここに置きたいのですが、これはエスケープの代わりに{}1文字の文字クラスに入れることです。それはあなたがどちらを好むかという好みの問題ですが、私はこれの読みやすさがより好きです:

(?<![{])[{]\w+[}](?![}])

編集:

VBScriptは後読みをサポートしていないようです。

それは少し問題です。あなたが得ることができる最も近いものは次のとおりです:

(^|[^{])[{]\w+[}](?![}])

ただし、文字列の先頭に一致が見つからない場合、これには前の文字が一致に含まれます。これだけでも問題はありません。部分文字列関数などをキャプチャすることで、その文字を取り除くことができるからです。ただし、一致は重複できないため、{some}{string}両方の一致を簡単に取得できないような入力がある場合(最初の一致}は2番目の一致の一部である必要があるため)。一部のエンジン\Gは、継続的な一致に相当するものを提供します^が、VBScriptもそれをサポートしていないようです。したがって、これからは醜くなります。

あなたができることは、}(別の先読みを使用して)試合からクロージングを除外することです:

(^|[^{])[{]\w+(?=[}](?![}]))

{someこれで、一致とが取得さ}{stringれるので、すべての一致を追加し}、文字列の先頭にないすべての一致から最初の文字を削除する必要があります。または、キャプチャされた結果を取得できる場合は、

(^|[^{])([{]\w+)(?=[}](?![}]))

次に、キャプチャグループを取得し2て追加します}

于 2012-12-09T14:59:33.127 に答える
3

この式は完全に機能します。

^{{1}(\w+?)}{1}$ 
于 2015-12-24T03:31:52.540 に答える
0

この特定のケースでは、^ {{1}(\ w +?)} {1} $を使用できます。これは{something}と一致しますが、{{something}}とは一致しませんが、something else and {something} after that。最後の文字列を正規表現と一致させたい場合は、前の答えがまさに必要なものです。

于 2012-12-09T15:17:20.913 に答える