2016-05-11 1 views
6

には、以下の正規表現を考えてみましょうテキストは:aa/b キャプチャグループは次のようになります。は、正規表現を経由++メモ帳で交換するときに条件文を使用する方法

/1 'a' 
/2 'a' 
/3 'b' 
/4 '' 

/2または/4が空の場合(上記の最初のケースのように)、この文字列を検索して置き換えたい場合は、前にcを追加します。

したがって、a/bのテキストはca/cbになります。

(?(2)\1\2|0\1)/(?(4)\3\4|0\3) 

しかし、メモ帳++は、このケースではなく、条件付きの識別子として文字通り?を扱っている: とテキストaa/bは私が交換のために、次の正規表現を使用しaa/cb

になります。どのようなアイデアを私は間違って何ですか?

+0

私は 'のあなたの配置を考える?'間違っている可能性があり、メモ帳++はリテラルとしてそれらを扱っている理由、これは可能性があります。 –

答えて

7

条件付き交換での構文は

(?{GROUP_MATCHED?}REPLACEMENT_IF_YES:REPLACEMENT_IF_NO} 
{

}はあなたが9より高いグループで、名前付きキャプチャグループを扱う際にあいまいさを避けるために必要です。

メモ帳++はこのBoost documentation見、Boost-Extended Format String Syntaxを使用しているので:

文字?条件式を開始し、一般的な形式は次のとおりです。Nは小数点の桁である

?Ntrue-expression:false-expression

サブ式Nが一致した場合は、true-expressionが評価され、出力されます。そうでない場合は、false-expressionが評価され、出力されます。

あいまいさを避けるため、通常、条件式をかっこで囲む必要があります。

たとえば、書式文字列(?1foo:bar)サブ発現$1が一致した場合fooで見つかった各一致を置き換え、それ以外の場合bar有するであろう。9より大きい、または名前付き部分式へのアクセスのためのインデックスを持つサブ式の場合

は使用:

?{INDEX}true-expression:false-expression

または

?{NAME}true-expression:false-expression

ので、([a-zA-Z])([a-zA-Z])?/([a-zA-Z])([a-zA-Z])?を使用します(?{2}$1$2:c$1)/(?{4}$3$4:c$3)と置き換えてください。

第二の問題は、グループ全体あなたはグループ内のパターンをオプションに、キャプチャグループ内?数量詞を置いていることですが、ありません。それはグループを常に「試合に参加する」ようにし、条件は常に「真」(常に一致)になります。 ?は、グループを定量する必要があります。

enter image description here

+0

Notepad ++に固有のドキュメント(ある場合)にリンクすることもできますか? – CinCout

+1

私はBoostリファレンスを含んでいました。 –

+0

ありがとう – CinCout

関連する問題