2

私は2本の弦を持っています

string a = "text 'text'"
string b = 'text "text"'

この言語では、 と の両方"'文字列リテラルの開始と終了に使用でき、それらの中に他の記号を含めることができます (引用符はアポストロフィ内で有効であり、その逆も同様です)。

両方を処理できる正規表現が必要です。現在、次のものがあります。

(?:\"|')(?<content>[^\"']*)(?:\"|')

しかしstring a、これを使用すると、完全な文字列ではなく、私だけが得られ"text 'ます。

4

2 に答える 2

1

どうですか:

('|")(?<content>[^\1]*)\1
于 2012-09-16T10:40:46.033 に答える
0

基本的なテクニックは次のとおりです。

(["'])((?:(?!\1).)*)\1

開始引用符はグループ #1 でキャプチャされ、キャプチャされた文字を除く(?:(?!\1).)*任意の文字の 0 個以上と一致します。それは別の一連のキャプチャ括弧で囲まれているため、コンテンツはグループ #2 でキャプチャされます。次に、最後の引用符と一致します。\1

ただし、名前付きグループを使用してコンテンツをキャプチャしているため、全体で名前付きグループを使用することをお勧めします (特に、使用しているフレーバーを言わず、名前付きグループと番号付きグループ間の相互作用が一貫していないため)あるフレーバーから次のフレーバーへ)。これは .NET または PHP で動作するはずです。

(?<quote>["'])(?<content>(?:(?!\k<quote>).)*)\k<quote>

ただし、.NET を使用している場合は、代わりにこれを使用することをお勧めします。

(?:"(?<content>[^"]*)"|'(?<content>[^']*)')

ほとんどのフレーバーでは、同じ正規表現内でグループ名を再利用することが困難または不可能になっていますが、.NET では何でも構いません。

于 2012-09-16T21:00:53.247 に答える