可选的嵌套捕获组

时间:2017-08-26 14:15:49

标签: regex

给出以下输入:

Invoice Date: {InvoiceDate(dd.mm.YYYY)}
Inoice Number: {InvoiceNumber}

我正在尝试提取

  • 第1场比赛:
    1. InvoiceDate
    2. DD.MM.YYYY
  • 第2场比赛:
    1. InvoiceNumber

我让this regex为发票日期工作:

\{([^}]+)\(([^)]+)\)\}
  

First regex result

但是很明显,(dd.mm.YYYY)不是可选的。

然后我尝试了this regex

\{([^}]+)(?:\(([^)]+)\))?\}

使用(?:)?语法似乎忽略了我的内部捕获组(dd.mm.YYYY)

  

Second Regex result

那么如何让\(([^)]+)\)可选?

3 个答案:

答案 0 :(得分:2)

你需要使第一个捕获组变得懒惰:

^(

请参阅demo here

或者,使用\{([^(]+)(?:\(([^)]+)\))?\} ^ 限制第一个捕获组中的字符,使其仅匹配括号:

<script>
    (function(d, s, id){
      var js, fjs = d.getElementsByTagName(s)[0];
      if (d.getElementById(id)) {return;}
      js = d.createElement(s); js.id = id;
      js.src = "https://connect.facebook.com/en_US/messenger.Extensions.js";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'Messenger'));
    window.extAsyncInit = function () {
        var isSupported = MessengerExtensions.isInExtension(); 
        alert(isSupported);
        // the Messenger Extensions JS SDK is done loading
        MessengerExtensions.getContext('YOU_APP_ID', 
          function success(result){
            alert("Success: "+result.psid);
          },
          function error(result){
            alert(JSON.stringify(result));
          }
        );
    };
</script>

答案 1 :(得分:1)

我从头开始打字工作,然后我不得不并排比较,看看我们的答案有什么区别:

/\{([^}(]+)(?:\(([^)]+)\))?\}/ // my answer
/\{([^}]+)(?:\(([^)]+)\))?\}/  // your answer

您可以看到我指定您的第一个捕获组不包括打开的圆括号。你们本来会捕获第一组中的整个字符串Invoicedate(dd.mm.YYYY),第二组没有任何内容。

这里是link

答案 2 :(得分:0)

为什么不分别抓住每件东西?

invoice date: {(.*?)\((.*?)\)}.*?invoice number: {(.*?)}

  • 标志:g,i,s
  • 步骤:348

Demo