我试图创建一个正则表达式来从字符串中提取数据。我的示例字符串:dn1:pts-sc1.1
。我期望的数据格式:['pts', 'sc', '1.1']
所以基本上是:
之后的每一组字母和结尾的数字。
/^[^:]+:(?:([a-z]+)-?)+([\d\.]+)$/g
不幸的是,它只返回最后一组字母。
['sc', '1.1']
我还尝试将+
添加到第一个捕获组:
/^[^:]+:(?:([a-z]+)+-?)+([\d\.]+)$/g
结果相同。唯一不同的是regex101给了我这个评论:
重复捕获组仅捕获最后一次迭代。如果您对数据不感兴趣,请在重复组周围放置捕获组以捕获所有迭代或使用非捕获组
- 修改
输入字符串的示例:
dn2.33:sc-pts-tt-as3.43
dn2.33:sc3.43
dn2.33:sc-tt-as3.43
所以基本上我不知道字母组的数量。
答案 0 :(得分:1)
您可能无法获得任意数量的组,其数量由模式中的捕获组数量指定。您可以将-
- 分隔的值匹配并捕获到1个组中,然后将其与-
分开以获取单个项目并动态构建结果:
var strs = ['dn2.33:sc-pts-tt-as3.43','dn2.33:sc3.43','dn2.33:sc-tt-as3.43'];
var rx = /^[^:]+:([a-z]+(?:-[a-z]+)*)([\d.]+)$/; // Define the regex
for (var s of strs) {
var res = []; // The resulting array variable
var m = rx.exec(s); // Run the regex search
if (m) { // If there is a match...
res = m[1].split('-'); // Split Group 1 value with - and assign to res
res.push(m[2]); // Add Group 2 value to the resulting array
}
console.log(s, "=>", res);
}

模式 - ^[^:]+:([a-z]+(?:-[a-z]+)*)([\d.]+)$
- 将匹配以下内容:
^
- 字符串开头[^:]+
- 除:
以外的1个字符:
- 冒号([a-z]+(?:-[a-z]+)*)
- 第1组(它将是abc-def-ghij
...):一个或多个字母后跟0个连续的-
和1+个字母序列(添加{{1修饰符使模式不区分大小写)/i
- 第2组(它可以只是"推送到#{1}}生成的数组中):1位或更多位数或([\d.]+)
m[2]
- 字符串结束。