【问题标题】:RegExp for Numbers in the Thousands千位数字的正则表达式
【发布时间】:2011-11-07 23:45:53
【问题描述】:

我正在尝试从论坛上的用户那里获取帖子计数。

if (td[i].innerHTML.match("Posts: (\d+)")) {
  postCount = RegExp.$1;
}

它可以工作,但如果一个数字是千位,它只会抓取第一个数字。如何调整它以获取整个数字,例如 1,000?

【问题讨论】:

  • 本地化是个问题,还是总是使用逗号作为千位分隔符来格式化这些值?

标签: php javascript regex


【解决方案1】:

我从未见过这种使用正则表达式的方式。但是应该这样做:

/Posts: (\d+(?:,\d+)?)/

这与1,000,000 不匹配,但如果您想涵盖所有情况,请将? 更改为*

/Posts: (\d+(?:,\d+)*)/

【讨论】:

    【解决方案2】:

    更多的磨坊...如果您想用数千个分隔符来测试数字,您可以执行以下操作:

    var matches = td[i].innerHTML.match(/\d{1,3}(,\d{3})*/);
    postCount = matches? matches[0] : 0;
    

    使用 textContent/innerText 可能比使用 innerHTML 更好,因为您可能想要删除标记。一个简单的函数可以是:

    function getText(el) {
    
      if (typeof el.textContent == 'string') {
        return el.textContent;
    
      } else if (typeof el.innerText == 'string') {
        return el.innerText;
      }
    }
    

    【讨论】:

      【解决方案3】:

      这应该可以解决问题:

      Posts: (\d*,?\d+)
      

      编辑:如果你想匹配 1,000,000(就像 Felix Kling 演示的那样),你需要一个用于上部的重复捕获组:

      Posts: ((?:\d+,)*\d+)
      

      【讨论】:

        【解决方案4】:

        如果您想捕获逗号,只需将您的模式更改为:

        Posts: (\d+(,\d{3})*)
        

        如果您不想要逗号,则需要一个额外的步骤。有人帮我解决 JS 语法,但我想可能是:

        postCount = RegExp.$1.replace(/,/g, '')
        

        【讨论】:

        • 您的正则表达式缺少结束 )
        • 感谢您的关注。我的愚蠢的复制/粘贴错误。
        【解决方案5】:

        如果他们使用逗号数字格式,例如 1,000,000,000,那么以下正则表达式应该可以正常工作:

        $posts = "Posts: 10,000,000";
        $pat = "/Posts: (\d+(?:,\d{3})*)/";
        preg_match($pat, $posts, $matches);
        $post_count = $matches[1];
        

        【讨论】:

        • 我认为第二个“+”应该是一个“*”。您还希望能够匹配“帖子:123”。
        • 很好,很抱歉。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多