【问题标题】:Regex match within parens括号内的正则表达式匹配
【发布时间】:2016-02-13 04:59:58
【问题描述】:

关于 SO re 有很多问题:在括号内匹配,parens 等,但我想知道如何在忽略该字符的同时匹配一个字符(parens)

"Key (email)=(basil@gmail.com) already exists".match(/\(([^)]+)\)/g)
// => ["(email)", "(basil@gmail.com)"]

我相信这是因为 JS 不支持[^)]。鉴于此,您建议如何提取括号中的值。

比起必须在值上调用.replace('(', '').replace(')', ''),我更喜欢不那么老套的东西

我希望返回值为["email", "basil@gmail.com"]

【问题讨论】:

  • [^)] 是不是看后面了?

标签: javascript regex


【解决方案1】:

braces () 之间的提取文本不返回 braces

使用这两个非常简单的例子:

使用.match()提取并构造数组

var arr = "Key (email)=(basil@gmail.com) already exists".match(/(?<=\()[^)]+(?=\))/g);

console.log( arr );

https://regex101.com/r/gjDhSC/1
MDN - String.prototype.match()


使用.replace()提取值并推送到数组

var arr=[];

"Key (email)=(basil@gmail.com) already exists"
    .replace(/\(([^)]+)\)/g, (p1, p2) => arr.push(p2) );

console.log( arr );

https://regex101.com/r/gjDhSC/2
MDN - String.replace()

【讨论】:

  • /\((.+?)\)/ig.exec("Key (email)=(basil@gmail.com) already exists") == ["(email)", "email"] 在 Chrome 控制台中?
  • 在 chrome 控制台中运行时,这两者仍然包含括号
  • @pherris - 你一针见血。在我的回答中归功于你。 (我添加了一个循环来收集所有结果。)
  • 迄今为止最紧凑、最高效的解决方案
  • @pherris ?只是不要使用exec 或它的兄弟match,因为你需要在while 中耗尽直到null - 而是使用replace() 来获得乐趣和利润。
【解决方案2】:

请看这里:How do you access the matched groups in a JavaScript regular expression?

结合@pherris 的评论:

var str = "Key (email)=(basil@gmail.com) already exists";
var rx = /\((.+?)\)/ig;
match = rx.exec(str);
alert(match[1]);
while (match !== null) {
   match = rx.exec(str);
   alert(match[1]);
}

JSfiddle:https://jsfiddle.net/60p9zg89/(会生成弹窗)


这会多次执行正则表达式,返回捕获的字符串(在括号中)。

向浏览器推送警报不是很有用,您指定返回一个数组 - 所以:

function rxGroups(rx, str) {
   var matches = new Array();
   match = rx.exec(str);
   while (match != null) {
      matches.push(match[1]);
      match = rx.exec(str);
   }
   return matches;
}

var x = rxGroups(
   /\((.+?)\)/ig,
   "Key (email)=(basil@gmail.com) already exists"
);

alert(x.join('\n'));

https://jsfiddle.net/60p9zg89/1/

【讨论】:

  • 我刚刚重新阅读了您的问题,并注意到您想要返回一个数组。我会适当调整。
  • 调整为包括返回一个数组。
【解决方案3】:

您可能想要第一个捕获组的结果。比赛结束后你可以获得第一组:

(function(s, x) {
 return s.match(x)
    .map(function(m) {
      var f = m.match(x);
      return RegExp.$1;
    });
})('Key (email)=(basil@gmail.com) already exists', /\(([^()]+)\)/g)

结果 = ["email", "basil@gmail.com"]

【讨论】:

  • 不知道你为什么投了反对票。这是一个被广泛接受的答案:stackoverflow.com/questions/3003310/… ...祝你好运。
  • 同意 - 我 +1,它有效。也可以说比我的解决方案更干净(我认为匿名函数和 .map 的性能非常有效?)
  • 实际上,我不知道代码的性能如何。似乎应该有更好的方法。
  • 尽管几乎所有浏览器都支持它,但 Perl 风格的 $1..$9 并不是 ecma 的正式组成部分。
  • 希望他们继续为其中的正则表达式标准化此类快捷方式/改进 - 在本地浏览器中拥有更多功能(因为我们再次远离瘦客户端/胖服务器并进入胖客户端/瘦服务器)有很多明显的理由。
【解决方案4】:
var str = "Key (email)=(basil@gmail.com) already exists";
var matches = [];
str.replace(/\((.*?)\)/g, function(g0,g1){matches.push(g1);})

【讨论】:

  • 您的回答如何增加更多价值 over this one?
  • 它没有。我只是不知道如何标记这个问题已经回答了
  • 好的,我试试。在我的手机上!!
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
相关资源
最近更新 更多