2

シリアル化された文字列にいくつかのシグナル フラグがあり、ユーザーが特定の操作を要求したときに、文字列からフラグを削除する必要があります。以下の文字列のすべてのケースで機能する正規表現を見つけることができませんでした。

var flags = "out:ab,bc,bcc,cd";

これは私が得た最も近いものです(たとえば、bcフラグを削除しています)

flags.replace(/[:,]bc\b/, "");

結果はout:ab,bcc,cdどちらがクールですが、abを削除するとoutbc,bcc,cdどちらが間違っているかがわかります。結果は常に文字列をシリアル化したままにしておく必要があります。たとえば、out:flag1,flag2 サブパターンをキャプチャしようとしましたが、オールラウンドに機能するコンボを見つけることができませんでした。

- より詳しい情報:

フラグは 0/1 信号です。フラグが存在する場合は、それを削除する必要があります。

Out: は操作モードで、In: の反対です (これはフラグの 2 番目のグループです)。簡単に言うと、Out: は「すべて許可しますが、これらはブラックリストに登録します」であり、In: は「すべて拒否しますが、これらはホワイトリストに登録します」です。アプリはどちらのモードでも実行できます。ab、bc、cd ... はサンプルのアルファベット キーです。

4

1 に答える 1

2

使用non-capturing parentheses:

var q = ['cd', 'bc'].join('|'),
    re = new RegExp('(?:[:]('+q+'))|(,('+q+')(?=,))|(,('+q+')$)', 'g'),
    flags = "out:ab,bc,bcc,cd";
flags.replace(re, '');
=> "out:ab,bcc"

MDN の正規表現から:

(?:x) 'x' に一致しますが、一致を覚えていません。括弧は非キャプチャ括弧と呼ばれ、正規表現演算子が動作する部分式を定義できます。サンプル式 /(?:foo){1,2}/ を考えてみましょう。非キャプチャ括弧がない場合、{1,2} 文字は「foo」の最後の「o」にのみ適用されます。キャプチャ括弧を使用すると、{1,2} は単語「foo」全体に適用されます。


編集:正規表現の説明

/(?:[:](cd|bc))|(,(cd|bc)(?=,))|(,(cd|bc)$)/g

パイプで区切られた 3 つのセクションがあります。?:[:](cd|bc)セミコロンの直後のフラグをカバーします。,(cd|bc)(?=,)一致した式の前のコンマを含め、コンマ間のフラグをカバーします。,(cd|bc)$文字列の末尾にあるフラグをカバーし、先行するコンマも含みます。


編集2:

RegExp を修正qしました。一致させたいフラグに置き換えます。

于 2013-06-11T22:04:39.767 に答える