2017-11-13 14 views
2

文字列が指定されています。 "{abc} Lorem ipsum {/ abc} {a} dolor {/ a}"JavaScript正規表現文字列一致/置換

中括弧 "tags"の出現を見つけて、見つかったタグとインデックスを保存して削除したい元の文字列から。インデックスごとに文字列の一部を削除しているので、この処理を繰り返していきたいと思います。最後にインデックスをすべて削除することはできません。上記の例では、何が起こるべきか、

  • 文字列を検索

    ...
  • インデックス0
  • 押すだけで検索 "{ABC}" {タグ: "{ABC}"、インデックス:0}アレイへ
  • 削除「{ ABC}」という文字列から
  • それ以上マッチが見つからなくなるまでステップ1を繰り返し
  • このロジックを考える

、 『{/ ABC}』インデックス11で発見されなければならない - ので、 『{ABC}』は既にされています除去された。

私は基本的には、実際に文字列の一部としてそれらをせずにあるもので、「タグ」の開始と終了を知っておく必要があります。

ほとんど正規表現を使用していますが、時にはオカレンスをスキップします。

let BETWEEN_CURLYS = /{.*?}/g; 
 
let text = '{abc}Lorem ipsum{/abc} {a}dolor{/a}'; 
 
let match = BETWEEN_CURLYS.exec(text); 
 
let tags = []; 
 

 
while (match !== null) { 
 
    tags.push(match); 
 
    text = text.replace(match[0], ''); 
 
    match = BETWEEN_CURLYS.exec(text); 
 
} 
 

 
console.log(text); // should be; Lorem ipsum dolor 
 
console.log(tags); 
 

 
/** 
 
* almost there...but misses '{a}' 
 
* [ '{abc}', index: 0, input: '{abc}Lorem ipsum{/abc} {a}dolor{/a}' ] 
 
* [ '{/abc}', index: 11, input: 'Lorem ipsum{/abc} {a}dolor{/a}' ] 
 
* [ '{/a}', index: 20, input: 'Lorem ipsum {a}dolor{/a}' ] 
 
*/

答えて

3

あなたはそれ以外の入力が短くなるので、次の反復が(予想以上に遠くから始まり、lastIndexはあなたの後に変更されませんが、正規表現lastIndex値から一致長を減算する必要があります){...}部分文字列を削除するにはreplaceを呼び出します。

let BETWEEN_CURLYS = /{.*?}/g; 
 
let text = '{abc}Lorem ipsum{/abc} {a}dolor{/a}'; 
 
let match = BETWEEN_CURLYS.exec(text); 
 
let tags = []; 
 

 
while (match !== null) { 
 
    tags.push(match); 
 
    text = text.replace(match[0], ''); 
 
    BETWEEN_CURLYS.lastIndex = BETWEEN_CURLYS.lastIndex - match[0].length; // HERE 
 
    match = BETWEEN_CURLYS.exec(text); 
 
} 
 

 
console.log(text); // should be; Lorem ipsum dolor 
 
console.log(tags);

心に留めするためにいくつかのより多くのRegExp#exec参照:

あなたの正規表現は、「g」フラグを使用している場合は、同じ文字列での連続したマッチを見つけるために、exec()メソッドを複数回使用することができます。あなたがそうすると、検索は(もlastIndexプロパティを進めるtest())正規表現のlastIndexプロパティで指定されたstrのサブから始まります。

+0

これは本当に良い答えです。私は同様のことに取り組んでいましたが、 '.lastIndex'がプロパティであることを認識しませんでした。 +1 – zfrisch

+1

ああ、意味があります!本当にありがとう! –

+1

@LewisPeel私はあなたの前の投稿で言及した置き換えの方法を考え出しましたが、 'input'部分は扱いにくいので、簡単に動作させることはできません。 –

関連する問題