【问题标题】:Javascript Regex and non-capturing parenthesesJavascript 正则表达式和非捕获括号
【发布时间】:2012-04-13 05:21:19
【问题描述】:

我的正则表达式和 Javascript 有点生疏。我有以下字符串变量:

var subject = "/admin.php?page=settings&tabs_added[114787535263592]=1&tabs_added[217770811582323]=1&tabs_added[198738186831542]=1"

我想提取114787535263592217770811582323198738186831542

我尝试使用非捕获括号(?:)

var regexp = /(?:tabs_added[\[])(\d)+(?:[\]])/;
var pageid = regexp.exec(subject);

但是我得到的结果 (["tabs_added[114787535263592]", "2"]) 不是我所期望的——我做错了什么?这是一个 jsFiddle:http://jsfiddle.net/KgpAw/

【问题讨论】:

  • 您的(?:) 组看起来不错,但(?+) 看起来很可疑。
  • @andrewcooke 抱歉,我在粘贴时搞砸了。这是?:
  • @T.J.Crowder 你完全正确。我添加了一个指向 jsFiddle 的链接,它显示了结果。

标签: javascript regex


【解决方案1】:

你们很亲密。您还需要捕获+。否则你只能捕获一位十进制数字:

var regexp = /(?:tabs_added[\[])(\

您还应该使您的正则表达式全局查找所有匹配项:

var regexp = /(?:tabs_added[\[])(\d+)(?:[\]])/g;

然后你应该遍历结果,你也不需要非捕获组,因为你没有在它们上使用量词(?+*),也不需要您需要将您的 [] 放在一个字符类中:

var regexp = /tabs_added\[(\d+)\]/g;
var result;
while(null != (result = regexp.exec(subject))){
    document.write(result[1] + '<br />');
} 

JSFiddle Example

注意:只要有可用的控制台,最好使用console.log 进行调试而不是document.write。 (Chrome、Opera、IE9 和 Firefox 都内置了控制台,我认为 Safari 也有,所以你应该有一个可用的。)console.log 在记录对象和数组时提供了更多有价值的信息。

【讨论】:

    【解决方案2】:

    您需要全局标志并匹配所有数字:(\d+) 而不是 (\d)+

    并且不需要所有那些非捕获子组。

    var regexp = /tabs_added\[(\d+)\]/g;
    var pageIds = [], match;
    while(match = re.exec(str)) pageIds.push(match[1]);
    pageIds;
    

    【讨论】:

      【解决方案3】:

      您好,我可以在一行代码中解决上述要求。

      <!DOCTYPE html>
      <html>
      <body>
      
      <script>
      var str="/admin.php?page=settings&tabs_added[114787535263592]=1&tabs_added[217770811582323]=1&tabs_added[198738186831542]=1"; 
      var patt1=/\d{15}/g; 
      document.write(str.match(patt1));
      </script>
      
      </body>
      </html>
      

      【讨论】:

        【解决方案4】:

        对于多个匹配项,您需要使用 g 修饰符。请尝试以下方法

        var regexp = /(?:tabs_added[\[])(\d)+(?:[\]])/g;
        var pageid = subject.match(regexp);
        

        这仍将包含 tabs_added 部分,但可以单独删除

        【讨论】:

          猜你喜欢
          • 2013-10-31
          • 2015-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多