0

我很难获得一个看似简单的正则表达式。我试图抓住字符串中方括号之间最后出现的单词字符。我的代码:

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

当我希望它输出“形状”时,上面的代码正在输出“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 回答