我很难获得看似简单的正则表达式。我试图抓住字符串中方括号之间最后出现的单词字符。我的代码:
pattern = /\[(\w+)\]/g;
var text = "item[gemstones_attributes][0][shape]";
if (pattern.test(text)) {
alert(RegExp.lastMatch);
}
当我希望输出“shape”时,上面的代码输出“gemstones_attributes”。为什么这个正则表达式不起作用,或者我的最后一场比赛方法有什么问题?我确信我犯了一个明显的错误 - 正则表达从来都不是我的字符串。
修改 在某些情况下,字符串不会以右括号终止。
答案 0 :(得分:2)
您可以在模式之前尽可能地贪婪地匹配,这将导致您的组仅匹配最后一个匹配:
pattern = /.*\[(\w+)\]/g;
var text = "item[gemstones_attributes][0][shape]";
var match = pattern.exec(text);
if (match != null) alert(match[1]);
答案 1 :(得分:1)
RegExp.lastMatch给出最后一个正则表达式的匹配。这不是文中的最后一场比赛。
正则表达式从左向右解析并且贪婪。所以你的正则表达式匹配它看到的第一个'['并抓住它之间的单词。当你调用lastMatch时,它会为你提供最后匹配的模式。你需要的是匹配你可以先得到的一切。*然后你的模式。
答案 2 :(得分:0)
使用match()
代替test()
if (text.match(pattern))
test()
检查字符串中的匹配项。这在第一次出现后是成功的,因此不需要进一步解析。
答案 3 :(得分:0)
我认为你的问题出在你的正则表达式而不是你的src行.lastMatch。
你的正则表达式只返回方括号的第一个匹配而不是所有匹配。您可以尝试将一些组添加到正则表达式中 - 通常您应该获得所有匹配项。
krikit