我试图在开头提取任何文本字符,以及字符串的以下两个数字。如果字符串以数字开头,我想获得一个空字符串值,因此结果数组仍然包含 3 个值。细绳: 'M2.55X.45'代码: 'M2.55X.45'.match(/(^[a-zA-Z]+)|((\.)?\d+[\/\d. ]*|\d)/g)预期的: ["M", "2.55", ".45"]实际(正确): ["M", "2.55", ".45"]细绳: '2.55X.45'代码: '2.55X.45'.match(/(^[a-zA-Z]+)|((\.)?\d+[\/\d. ]*|\d)/g)预期的: ["", "2.55", ".45"]实际的: ["2.55", ".45"]
3 回答
Qyouu
TA贡献1786条经验 获得超11个赞
您当前的正则表达式使用备用子句 ( |),它根据匹配的备用子句创建不同类型的分组。
这是一个创建显式组并使各个组可选的示例(稍微整理一下)。
const regex = /^([a-zA-Z]*)?(\d*(?:\.\d+)?)([a-zA-Z]+)(\d*(?:\.\d+)?)$/
console.log(regex.exec("2.55X.45"))
console.log(regex.exec("M2.55X.45"))
请注意,我已删除该g标志,因此不会保留正则表达式的状态。
我还使用exec而不是match不丢弃捕获组。
人到中年有点甜
TA贡献1895条经验 获得超7个赞
你可以试试这个模式
(\D*)(\d+(?:\.\d+))\D+(\.\d+)

let finder = (str) => {
return (str.match(/^(\D*)(\d+(?:\.\d+))\D+(\.\d+)/) || []).slice(1)
}
console.log(finder('M2.55X.45'))
console.log(finder("2.55X.45"))
添加回答
举报
0/150
提交
取消
