javascript - 正则表达式匹配字符串中的多个数字
问题描述
我想从字符串中提取数字,例如
这三个城镇有1000人。
并得到一个像["1,000", "3"]
.
在这个问题中,我从贾斯汀那里得到了以下与正则表达式匹配的数字
^[+-]?(\d*|\d{1,3}(,\d{3})*)(\.\d+)?\b$
这对于检查它是否是一个数字很有用,但要让它在一个句子上工作,你需要删除“^”和“$”。
regex101 定义了开始/结束 regex101 没有定义开始/结束
如果没有定义开始和结束,您会得到一堆长度为 0 的匹配项,这些匹配项很容易被丢弃,但现在它也会用逗号分割任何数字。
如何使该正则表达式(或新的正则表达式)在句子上工作,并且仍然可以找到其中带有逗号的数字。
奖励将不会有所有 0 长度匹配。
解决方案
/-?\d(?:[,\d]*\.\d+|[,\d]*)/g
如果您可以允许不同的组,例如 1,00,000(在某些语言环境中这不是未知的),则表达式应该这样做。我觉得我应该能够进一步简化它,但是当我尝试示例时,“333.33”被分解为“333”和“33”作为单独的数字。与上面它保持在一起。
现场示例:
const str = "There are 10,000 people in those 3 towns. That's 3,333.33 people per town, roughly. Which is about -67.33 from last year.";
const rex = /-?\d(?:[,\d]*\.\d+|[,\d]*)/g;
let match;
while ((match = rex.exec(str)) !== null) {
console.log(match[0]);
}
分解/\d(?:[,\d]*\.\d+|[,\d]*)/g
:
-?
- 一个可选的减号(感谢x15在他/她的回答中指出这一点!)\d
- 一个数字(?:...|...)
- 一个非捕获组,包含之间的交替[,\d]*\.\d+
- 零个或多个逗号和数字后跟一个.
和一个或多个数字,例如3,333.33
;或者[,\d]*
- 零个或多个逗号和数字
第一个选项将贪婪匹配,如果没有小数点,则回退到第二个选项。
推荐阅读
- ada - 未能断言 libsparkcrypto SHA256 结果相等
- docker - VPN 连接的 Docker 容器无法访问其他容器
- ios - Swift - 如何从 TableView 中的多个选定单元格中将数据保存到 Firebase?
- spring - 如何处理所有标准 Spring MVC 异常
- blazor - Blazor 发出 Javascript 以关闭浏览器窗口
- python - 如何将单个日期时间值偏移四分之一,而不是系列?
- firebase - 来自 Firestore 规则的 Firebase 安装身份验证令牌验证
- c# - 项目“..\..\Common\Common.csproj”以“net5.0”为目标。以 '.NETStandard,Version=v2.0' 为目标的项目不能引用它
- javascript - 如何在另一个递归函数中调用递归函数?
- opencart - 将 opencart 2.3 扩展的控制器文件重写为 opencart 3.X (twig)