230

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

I expect five hundred dollars ($500).

会回来

$500

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

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

4

10 回答 10

570

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

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的视觉解释

于 2013-07-22T04:11:00.723 回答
38

尝试字符串操作:

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));
}
于 2013-07-22T05:06:30.293 回答
18

简单的解决方案

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

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

在线演示(jsfiddle)

于 2017-12-18T08:50:29.873 回答
15

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

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

图案。请参阅正表达式演示

在 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):

var strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
var rx = /\(([^()]*)\)/g;


for (var i=0;i<strs.length;i++) {
  console.log(strs[i]);

  // Grab Group 1 values:
  var res=[], m;
  while(m=rx.exec(strs[i])) {
    res.push(m[1]);
  }
  console.log("Group 1: ", res);

  // Grab whole values
  console.log("Whole matches: ", strs[i].match(rx));
}

于 2018-07-12T08:21:53.553 回答
12

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

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })
于 2015-12-26T03:58:10.797 回答
6

对于货币符号后的数字:\(.+\s*\d+\s*\)应该有效

\(.+\)括号内的任何内容

于 2013-07-22T04:11:56.360 回答
5

选择:

var str = "I expect five hundred dollars ($500) ($1).";
str.match(/\(.*?\)/g).map(x => x.replace(/[()]/g, ""));
→ (2) ["$500", "$1"]

如果需要,可以用方括号或大括号替换括号

于 2020-04-21T17:13:40.887 回答
3

let str = "Before brackets (Inside brackets) After brackets".replace(/.*\(|\).*/g, '');
console.log(str) // Inside brackets

于 2019-10-14T20:40:20.037 回答
2
var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/;
alert(rex.exec(str));

将匹配以 $ 开头并后跟 ')' 的第一个数字。')' 不会成为匹配的一部分。代码会在第一次匹配时发出警报。

var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/g;
var matches = str.match(rex);
for (var i = 0; i < matches.length; i++)
{
    alert(matches[i]);
}

此代码警告所有匹配项。

参考:

搜索“?= n” http://www.w3schools.com/jsref/jsref_obj_regexp.asp

搜索“x(?=y)” https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp

于 2015-11-20T13:06:52.810 回答
1

简单的: (?<value>(?<=\().*(?=\)))

我希望我有所帮助。

于 2020-12-23T19:43:13.030 回答