2011-01-20 7 views
2

私は文字列を持っていると言いますHello {{name}}, how are you doing today?私はその文字列からnameを取得しようとしています。グローバル非キャプチャグループのRegEx質問

これまでのところ、私には/\{{2}[a-z0-9]*\}{2}/giがあります。問題は、{{name}}で、nameではないことです。グローバルフラグがなければ、うまく動作しますが、二重括弧内の言葉のすべてのインスタンスを取得しようとしていますので、そうではありません...私はRegExプロではないので、誰かが私を助けることを望んでいます...

答えて

4

{{}}はピックアップされませんが、JavaScript正規表現はlookbehindをサポートしていません。lookaheadしかサポートしていません。

/\{{2}([a-z0-9]*)\}{2}/gi 

すべてのキャプチャを取得するには、あなたの正規表現でRegExpオブジェクトを作成し、そのexec()関数の結果を反復処理:

だから一つの代替は、キャプチャグループにテキストを配置し、内部に何つかむことです。たとえば、次のように

var str = 'Hello {{name}}, how are you doing {{date}}?'; 
var re = /\{{2}([a-z0-9]*)\}{2}/gi; 
var words = []; 
var match; 

while (match = re.exec(str)) { 
    words.push(match[1]); 
} 

jsFiddle sample

それともガンボとして手動で試合のあなたの配列から{{}}を取り除く、彼のコメントで示唆しています。

+2

OPが言ったようにため/ gのフラグの、それは私には驚くべきことであったが、これは動作しません。基本的に違いはありません。私はそれがjavascriptが正規表現を扱う方法のためだと思います。 perlではうまく動作します。 –

+0

@crimson_penguin:すべてのキャプチャを取得するには、 'RegExp.exec()'を繰り返し実行する必要があります。 – BoltClock

+1

@crimson_penguin:それは問題ありません。 'matches.map(function(val){return val.substring(2、val.length-2);})'。 – Gumbo

0

いや述べたように、2つの開閉括弧でパターンマッチングを移動するための方法である(名前を仮定すると、開口/閉鎖のいずれかで、自体内2の数の連続して中括弧をしていません)

/\{{2}([a-z0-9]+)*\}{2}/gi

関連する問題