4

私の Web アプリケーションは、括弧で囲まれた文字列の数値範囲を解析する必要があります。私は正規表現を正しく理解したことがないので、助けが必要です。以下のコードは、私がやろうとしていることのようなものです (ハイフンで文字列を分割し、最小/最大値を取得します)。明らかにパターンが間違っています。以下の例では、"(10-12) foo (5-10) bar" というアラートが表示されますが、目的の結果が (10-12) という 1 つのアラートと次の (5-10) というアラートである場合、またはさらに良い結果が得られます。可能であれば、括弧なしの値。

任意の支援をいただければ幸いです。

var string = "foo bar (10-12) foo (5-10) bar";
var pattern = /\(.+\)/gi;
matches = string.match(pattern);

for (var i in matches) {
    alert(matches[i]);
}
4

2 に答える 2

8

?の後にを追加して、数量詞を怠惰にします+(そうでなければ、それはあなたのオープニングからストリングの最後まで、可能な限り貪欲に消費し)ます。

var string = "foo bar (10-12) foo (5-10) bar",
    pattern = /\(.+?\)/g,
    matches = string.match(pattern);

jsFiddle

かっこを一致に含めたくない場合は、通常、前向きの先読みと後ろ向きのかっこを使用します。JavaScriptは後読みをサポートしていません(偽造することはできますが)。だから、使用してください...

var string = "foo bar (10-12) foo (5-10) bar",
    pattern = /\((.+?)\)/g,
    match,
    matches = [];

while (match = pattern.exec(string)) {
    matches.push(match[1]);
}

jsFiddle

また...

  • i正規表現にフラグは必要ありません。どの文字とも一致しません。
  • 変数のスコープは常に。で指定する必要がありますvar。あなたの例でmatchesは、グローバルになります。
  • for (in)配列を反復処理するためにを使用しないでください。match()また、それが返されないことを確認する必要がありますnull(結果が見つからなかった場合)。
于 2012-04-30T07:36:41.727 に答える
3

問題は、正規表現が貪欲であるということです。つまり、最初の角かっこと一致し、最後の角かっこが見つかるまで続行します。?これを修正するには、2つのオプションがあります。の後に記号を追加して、+欲張りでないようにします。\(.+?\)または、閉じ括弧以外の任意の文字と一致させます\([^)]+\)

これらの正規表現は両方とも、必要なことを実行する必要があります。

于 2012-04-30T07:38:46.517 に答える