2012-03-20 11 views
9

私はregexを初めて使用しています。中括弧内のすべての内容を文字列で解析しようとしています。私は参考としてthis postを探して答えが示唆したとおり正確に行ったが、結果は予期せぬものであった。ここでjavascript、regex中括弧で文字列の内容を解析します

は、私は私が間違ってやっているものを、私は何かが欠けています考えて

var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/ 
regex.exec(abc) // i got ["{string1}", "string1"] 
      //where i am expecting ["string1", "string2"] 

をやったことありますか?

更新

私はグローバルな検索のために/gでそれを得ることができた

var regex = /{(.*?)}/g 
abc.match(regex) //gives ["{string1}", "{string2}"] 

はどのようにI/Oのブラケットwの文字列を得ることができますか?

答えて

17
"test/abcd{string1}test{string2}test".match(/[^{}]+(?=\})/g) 

それはすべての}が対応するその前{{...}セクションが巣をないしていることを前提としてい

["string1", "string2"] 

を生成します。空の{}セクションの内容もキャプチャされません。

+0

偉大な、ちょうど私が欲しかった –

+3

これは良いです。しかし、閉じ括弧をエスケープする必要はありません。 '/ [^ {}] +(?=})/ g' – Kash

0

この結果:

["{string1}", "string1"] 

は、最初のマッチのために、正規表現全体が"{string1}"にマッチし、最初の捕捉括弧は"string1"と一致したことをあなたに示しています。

あなたはすべての一致を取得し、各試合のすべてのキャプチャ括弧を見たい場合は、あなたがこのようなexec()複数回の呼び出しを介して、「G」フラグとループを使用することができます。

var abc = "test/abcd{string1}test{string2}test"; //any string 
var regex = /{(.+?)}/g; 
var match, results = []; 
while (match = regex.exec(abc)) { 
    results.push(match[1]); // save first captured parens sub-match into results array 
} 

// results == ["string1", "string2"] 

あなたはそれを見ることができますここで働い:http://jsfiddle.net/jfriend00/sapfm/

+0

条件での割り当て...私のお茶はありません。 – jbabey

+0

このタイプのループを実行する効率的な方法であり、この正確な目的には多少共通です。私はこのタイプの場合を除いて、一般的にそれを避けるだろう。あなたが望むならば、それを使わずに同じことを達成するために、さらに2行のコードを使うことができます。 – jfriend00

+0

説明のためにありがとう、私はなぜ同じ文字列が2回現われたのだろうかと思っていた。ありがとうございました! –

1

はこれを試してみてください:JavaScriptで正規表現について読むこと

var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/g //g flag so the regex is global 
abc.match(regex) //find every match 

良い場所はhere、そして素敵なPLACですテストするeはhere

幸運です!

+0

私はgがここで違いを生むとは思わない。 2度目のマッチ(string2)は得られません。これはexecを1回だけ呼び出すためです。 – Kash

+0

@Kashあなたは正しいですが、私はマッチと呼ばれ、gがなければ '[" {string1} "、" string1 "]' – NicoSantangelo

+0

偉大な正規表現の学習リソース、ありがとうございます –

0

何も間違っていません。しかし、必要なコンテンツを取得するには、キャプチャするグループ(配列の2番目の要素)を見る必要があります(最初のものは無視できます)。すべての発生を取得するには、execを実行するだけでは不十分です。matchを使用して結果をループする必要があります。

を編集してください:あなたはmatchでキャプチャグループにアクセスすることはできません。より単純な解決法は、マイクサミュエルsuggestedのように肯定的な先読みを使用することです。

1
var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/g 
var matches; 

while(matches = regex.exec(abc)) 
    console.log(matches); 
関連する問題