在Javascript中获取括号之间的字符串的正则表达式

IT技术 javascript regex string
2021-01-24 05:10:07

我正在尝试编写一个正则表达式,它返回一个位于括号之间的字符串。例如:我想获取位于字符串“(”和“)”之间的字符串

I expect five hundred dollars ($500).

会回来

$500

在Javascript中找到正则表达式以获取两个字符串之间的字符串

但我是正则表达式的新手。我不知道如何在正则表达式中使用 '(', ')'

6个回答

您需要创建一组转义(带\)括号(与括号匹配)和一组创建捕获组的常规括号:

var regExp = /\(([^)]+)\)/;
var matches = regExp.exec("I expect five hundred dollars ($500).");

//matches[1] contains the value between the parentheses
console.log(matches[1]);

分解:

  • \( : 匹配一个左括号
  • ( : 开始捕获组
  • [^)]+: 匹配一个或多个非)字符
  • ) : 结束捕获组
  • \) : 匹配右括号

这是RegExplained上的直观解释

如果括号内有多个字符串,如下所示,解决方案是什么:“我希望(五)百美元(500 美元)” 假设我想要一个包含这些特殊字符串的数组。
2021-03-14 05:10:07
+1 不错,工作起来很有魅力。我想添加您以将这个tinyurl.com/mog7lr3添加到您的可视化解释中。
2021-03-23 05:10:07
此正则表达式仅在每个 sting 匹配一个实例时才有效。使用全局/g标志不会按预期工作。
2021-03-31 05:10:07
如果您要捕获的括号内有括号,这将不起作用。例如:“我期望五百美元(500 美元(但我知道我再也见不到那笔钱了))。”
2021-04-07 05:10:07
@IanWarburton,matches[0] 为您提供与“($500)”匹配的完整字符串,而matches[1] 仅提供捕获组中的内容。以下是有关 regExp.match() 返回值的更多信息。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-10 05:10:07

尝试字符串操作:

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var newTxt = txt.split('(');
for (var i = 1; i < newTxt.length; i++) {
    console.log(newTxt[i].split(')')[0]);
}

或正则表达式(与上述相比有点

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var regExp = /\(([^)]+)\)/g;
var matches = txt.match(regExp);
for (var i = 0; i < matches.length; i++) {
    var str = matches[i];
    console.log(str.substring(1, str.length - 1));
}
今天在 Chrome 59.0.3071 中运行该 jsperf,正则表达式速度提高了 8%
2021-03-20 05:10:07

简单的解决方案

注意:此解决方案可用于仅具有单个“(”和“)”的字符串,例如此问题中的字符串。

("I expect five hundred dollars ($500).").match(/\((.*)\)/).pop();

在线演示 (jsfiddle)

匹配括号内的子字符串,不包括您可以使用的任何内括号

\(([^()]*)\)

图案。正则表达式演示

在 JavaScript 中,像这样使用它

var rx = /\(([^()]*)\)/g;

图案详情

  • \(- 一个(字符
  • ([^()]*)- 捕获组 1:匹配除and之外的任何 0 个或多个字符否定字符类()
  • \)- 一个)字符。

要获得整个匹配,请获取 Group 0 值,如果您需要括号内的文本,请获取 Group 1 值。

最新的 JavaScript 代码演示(使用matchAll):

const strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
const rx = /\(([^()]*)\)/g;
strs.forEach(x => {
  const matches = [...x.matchAll(rx)];
  console.log( Array.from(matches, m => m[0]) ); // All full match values
  console.log( Array.from(matches, m => m[1]) ); // All Group 1 values
});

旧版 JavaScript 代码演示(符合 ES5):

@postgresnewbie 它已经在那里了,console.log( Array.from(matches, m => m[0]) ); // All full match values你不需要那个组,然后可以使用var rx = /\([^()]*\)/g;
2021-03-16 05:10:07
如何包括括号,你能举一个例子吗?
2021-03-18 05:10:07
@limitlessloop 由于这似乎是一个有用的答案,我还添加了一个新的matchAll基于 JavaScript 的代码演示。
2021-03-27 05:10:07
这个正则表达式很棒,因为它只捕获成对()和它们的内容,即使是并排的()()
2021-03-28 05:10:07
这个答案是最好的。
2021-04-09 05:10:07

移植Mr_Green对函数式编程风格的回答,以避免使用临时全局变量。

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })
2021-03-31 05:10:07