4

私はそのような文字列を持っています:

<p>Year: ={year}</p>\
<p>Director: ={director}</p>\
<ul>@{actors}<li class="#{class}">={actor}</li>{actors}</ul>\

={match}そして、私は中にないものをすべて抽出したい@{word}...{word}ので、この場合、私は一致させたいのですが、では={year}あり={director}ません={actor}。これは私がこれまでに得たものですが、機能していません。

/(?!@.*)=\{([^{}]+)\}/g

何か案は?

編集:私の現在の解決策は、={match}内部のすべてを見つけて、のようなもの@{}...{}に置き換えることです。次に、外にあるものをつかみ、最後に戻って、フラグが立てられたものを元の状態に戻します。==&

4

2 に答える 2

3

次のように、正規表現を使用して文字列をセグメントに分割できます。

var s = '<p>Year: ={year}</p> \
<p>Director: ={director}</p> \
<ul>@{actors}<li class="#{class}">={actor}</li>{actors}</ul>',
  re = /@\{([^}]+)\}(.*?)\{\1\}/g,
  start = 0,
  segments = [];

while (match = re.exec(s)) {
  if (match.index > start) {
    segments.push([start, match.index - start, true]);
  }
  segments.push([match.index, re.lastIndex - match.index, false]);
  start = re.lastIndex;
}

if (start < s.length) {
  segments.push([start, s.length - start, true]);
}

console.log(segments);

あなたの例に基づいて、あなたはこれらのセグメントを得るでしょう:

[
    [0, 54, true], 
    [54, 51, false], 
    [105, 5, true]
]

ブール値は、セグメントの外側にいるのか、セグメントtrueの内側にいるのかを示します。@{}...{}後方参照を使用して、終了と開始を照合します。

次に、セグメントに基づいて、通常どおりに置換を実行できます。

于 2013-02-05T07:41:49.610 に答える
0

ここに行く、エンディング{whatever}もネガティブに先を見据える必要がある

/(?!@.*)=\{([^{}]+)\}(?!.*\{[^{}]+\})/g

アップデート:

以前は{match}行ごとにのみ機能します。

フックオン@は実際にはLookBehindを意味し、この場合LookBehindを使用することは困難です。これは、LookBehindが検索する文字数を正確に把握することを非常に好むためです。

それでは、先を見据えるためにLookAheadを使用しましょう:=\{([^{}]+)\}(?![^@]*[^=@]{)最後にフックを付けます{tag}

編集:デモhttp://regex101.com/r/zH7uY6

于 2013-02-05T07:16:50.097 に答える