0

一見単純な正規表現を取得するのに苦労しています。文字列の角かっこで囲まれた単語文字の最後の出現を取得しようとしています。私のコード:

pattern = /\[(\w+)\]/g;
var text = "item[gemstones_attributes][0][shape]";
if (pattern.test(text)) {
    alert(RegExp.lastMatch);
}

上記のコードは、「shape」を出力したいときに「gemstones_attributes」を出力しています。この正規表現が機能しないのはなぜですか、または最後の一致を取得するための私のアプローチに何か問題がありますか?私は明らかな間違いを犯していると確信しています-正規表現は私のストリングスーツではありませんでした。

編集: 文字列が右角かっこで終了しない場合があります。

4

4 に答える 4

2

パターンの前に可能な限り貪欲に一致させることができます。これにより、グループは最後の一致のみに一致します。

pattern = /.*\[(\w+)\]/g;
var text = "item[gemstones_attributes][0][shape]";
var match = pattern.exec(text);
if (match != null) alert(match[1]);
于 2012-08-22T06:04:15.600 に答える
1

RegExp.lastMatch は、最後の正規表現の一致を示します。テキストの最後の一致ではありません。

正規表現は左から右に解析し、貪欲です。したがって、正規表現は最初に検出された「[」と一致し、その間の単語を取得します。lastMatch を呼び出すと、最後に一致したパターンが返されます。必要なのは、最初に .* 、次にパターンをすべて一致させることです。

于 2012-08-22T06:05:40.567 に答える
0

match()の代わりに使用test()


if (text.match(pattern))

test()文字列内の一致をチェックします。これは最初の発生後に成功するため、さらに解析する必要はありません。

于 2012-08-22T06:08:12.157 に答える
0

あなたの問題は、src行の.lastMatchではなく、正規表現にあると思います。

正規表現は、すべての一致ではなく、角括弧の最初の一致のみを返します。正規表現にいくつかのグループを追加してみると、通常はすべての一致が得られるはずです。

クリキット

于 2012-08-22T06:09:15.123 に答える