web-dev-qa-db-ja.com

javascript、regexは中括弧内の文字列コンテンツを解析します

私は正規表現に不慣れです。文字列の中括弧内のすべてのコンテンツを解析しようとしています。私は この投稿 を参照として調べ、回答の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}"]

角かっこなしで文字列を取得するにはどうすればよいですか?

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

を生成します

["string1", "string2"]

すべての}の前に対応する{があり、{...}セクションはネストしないことを前提としています。また、空の{}セクションのコンテンツもキャプチャされません。

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

while(matches = regex.exec(abc))
    console.log(matches);
2
ZER0

これを試して:

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

javascriptで正規表現について読むのに適した場所は ここ であり、テストするのに適した場所は ここ です。

幸運を!

1
nicosantangelo

この結果:

_["{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/

0
jfriend00

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

編集:気にしないでください、matchでキャプチャグループにアクセスすることはできません。より簡単な解決策は、Mike Samuel 推奨 のように、前向きな先読みを使用することです。

0
mgibsonbr