4

我的 Web 应用程序需要解析用括号括起来的字符串中的数字范围。我从来没有真正理解过正则表达式,所以我需要一些帮助。下面的代码是我想要做的(然后我将在连字符上拆分字符串并获取最小/最大值)。显然模式是错误的 - 当我想要的结果是 1 个警报说 (10-12) 和下一个说 (5-10) 或更好时,下面的示例会警报“(10-12) foo (5-10) bar”如果可能的话,那些没有括号的值。

任何帮助表示赞赏。

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);

js小提琴

如果您不想在匹配项中包含括号,通常您会使用正向前瞻和后向查看括号。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]);
}

js小提琴

还...

  • 您不需要i正则表达式中的标志;你不匹配任何字母。
  • 您应该始终使用var. 在您的示例中,matches将是全局的。
  • 您不应该使用 afor (in)来迭代数组。您还应该检查match()不返回null(如果没有找到结果)。
于 2012-04-30T07:36:41.727 回答
3

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

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

于 2012-04-30T07:38:46.517 回答