正则表达式/javascript 用于匹配括号中的值

Regex/Javascript for Matching Values in Parenthesis

本文关键字:javascript 用于 正则表达式      更新时间:2023-09-26

我的 Web 应用程序需要解析用括号括起来的字符串中的数字范围。我从来没有真正正确理解正则表达式,所以我需要一些帮助。下面的代码是我想做的(然后我将拆分连字符上的字符串并获取最小/最大值)。显然模式是错误的 - 下面的示例提醒"(10-12) foo (5-10) bar",当我想要的结果是 1 个警报说 (10-12) 和下一个说法 (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]);
}

通过在+后添加一个?来使您的量词变得懒惰。否则,它会贪婪地消耗尽可能多的东西,从你的开场(到字符串中的最后一个)

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

jsFiddle。

如果您不想在匹配项中包含括号,通常您会使用正面前瞻和后视括号。JavaScript 不支持 lookbehinds(尽管你可以伪造它们)。所以,使用...

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(如果未找到结果)。

问题是你的正则表达式是贪婪的,这意味着它将匹配第一个括号并继续前进,直到找到最后一个括号。要解决此问题,您有两个选择,您可以在+后添加?符号以使其不贪婪:'(.+?')或者,匹配除右括号以外的任何字符:'([^)]+')

这两个正则表达式都应该满足您的需求。