【问题标题】:Regular Expression to get a string between parentheses in Javascript正则表达式在Javascript中获取括号之间的字符串
【发布时间】:2013-07-20 17:25:02
【问题描述】:

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

I expect five hundred dollars ($500).

会回来

$500

找到Regular Expression to get a string between two strings in Javascript

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

【问题讨论】:

标签: javascript regex string


【解决方案1】:

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

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

【讨论】:

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

尝试字符串操作:

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

或正则表达式(有点像slow compare to the above

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%
【解决方案3】:

简单的解决方案

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

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

Online demo (jsfiddle)

【讨论】:

    【解决方案4】:

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

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

    模式。见the regex demo

    在 JavaScript 中,像这样使用它

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

    模式详情

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

    要获取整个匹配,请获取第 0 组的值,如果需要括号内的文本,请获取第 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));
    }

    【讨论】:

    • 这个正则表达式非常棒,因为它只捕获一对 () 及其内容,即使并排()()
    • @limitlessloop 因为这似乎是一个有用的答案,我还添加了一个新的基于 matchAll 的 JavaScript 代码演示。
    • 这个答案是最好的。
    • 如何包含括号,你也可以举个例子吗?
    • @postgresnewbie 它已经在那里了,console.log( Array.from(matches, m =&gt; m[0]) ); // All full match values。那你就不需要组了,可以使用var rx = /\([^()]*\)/g;
    【解决方案5】:

    Mr_Green's answer 移植到函数式编程风格以避免使用临时全局变量。

    var matches = string2.split('[')
      .filter(function(v){ return v.indexOf(']') > -1})
      .map( function(value) { 
        return value.split(']')[0]
      })
    

    【讨论】:

    【解决方案6】:

    对于货币符号后的数字:\(.+\s*\d+\s*\) 应该可以工作

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

    【讨论】:

    • 这将适用于示例文本,但是如果另一个) 出现在字符串后面,如I expect five hundred dollars ($500). (but I'm going to pay).+ 的贪婪将捕获更多。
    • @Denomales 那么你如何让它捕获这些字符串的两个实例。理想情况下,我正在做类似的事情,但我希望:($500)(but I'm going to pay) 匹配但在两个单独的匹配中而不是被视为单个匹配项?提前致谢!
    • (.+) 满足我的要求。需要捕获诸如“Dunhill(瓶/包/罐/镜头)”之类的东西并返回“Dunhill”
    【解决方案7】:

    替代方案:

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

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

    【讨论】:

    • str 没有括号时,这会被破坏
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:
      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

      【讨论】:

        【解决方案10】:

        简单: (?&lt;value&gt;(?&lt;=\().*(?=\)))

        希望我能帮上忙。

        【讨论】:

          猜你喜欢
          • 2011-07-17
          • 2010-09-29
          • 2015-07-05
          相关资源
          最近更新 更多