私は正規表現に不慣れです。文字列の中括弧内のすべてのコンテンツを解析しようとしています。私は この投稿 を参照として調べ、回答の1つが示唆するとおりに実行しましたが、結果は予想外です。
これが私がしたことです
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}"]
角かっこなしで文字列を取得するにはどうすればよいですか?
"test/abcd{string1}test{string2}test".match(/[^{}]+(?=\})/g)
を生成します
["string1", "string2"]
すべての}
の前に対応する{
があり、{...}
セクションはネストしないことを前提としています。また、空の{}
セクションのコンテンツもキャプチャされません。
var abc = "test/abcd{string1}test{string2}test" //any string
var regex = /{(.+?)}/g
var matches;
while(matches = regex.exec(abc))
console.log(matches);
この結果:
_["{string1}", "string1"]
_
は、最初の一致で、正規表現全体が_"{string1}"
_に一致し、最初のキャプチャ括弧が_"string1"
_に一致したことを示しています。
すべての一致を取得し、各一致のすべてのキャプチャ親を表示する場合は、「g」フラグを使用してループスルーし、次のようにexec()
を複数回呼び出すことができます。
_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/
何も間違っていません。ただし、必要なコンテンツを取得するには、キャプチャグループ(配列の2番目の要素)を確認する必要があります(最初の要素は無視してかまいません)。すべてのオカレンスを取得するには、exec
を1回実行するだけでは不十分です。match
を使用して結果をループする必要があります。
編集:気にしないでください、match
でキャプチャグループにアクセスすることはできません。より簡単な解決策は、Mike Samuel 推奨 のように、前向きな先読みを使用することです。