Javascript 使用正则表达式模式从字符串中提取特定数据

Javascript 使用正则表达式模式从字符串中提取特定数据,javascript,node.js,regex,Javascript,Node.js,Regex,我有如下数据 12xATG370g,12x720ml,1glas=0.97,1kg=2.03 versch。分拣机,2 x 250克,1个包装=1-100克=0.40 2 x 950克,1包=4.98,1公斤=4.47,tiefgekühlt versch。分拣机,2 x 500克,1个包装=0.65,1千克=1。- 3,5%Fett,3 x 1升,1包=0.76,1升=0.60 Krönung Aroma ganze Kaffeebohnen的Krönung天平,500克,1公斤=6.44 v

我有如下数据

  • 12xATG370g,12x720ml,1glas=0.97,1kg=2.03
  • versch。分拣机,2 x 250克,1个包装=1-100克=0.40
  • 2 x 950克,1包=4.98,1公斤=4.47,tiefgekühlt
  • versch。分拣机,2 x 500克,1个包装=0.65,1千克=1。-
  • 3,5%Fett,3 x 1升,1包=0.76,1升=0.60
  • Krönung Aroma ganze Kaffeebohnen的Krönung天平,500克,1公斤=6.44
  • versch。分拣机,400克,1千克=5.60
  • 400g,versch。分拣机,1千克=5.60
  • 预期结果

  • 12x720ml=>{包装:12,重量:720,单位:ml}
  • 2x250克=>{包装:2件,重量:250,单位:克}
  • 2 x 950克=>{包装:2件,重量:950,单位:克}
  • 2x500克=>{包装:2件,重量:500,单位:克}
  • 3x1升=>{包装:3件,重量:1件,单位:升}
  • 500克=>{包装:1件,重量:500,单位:克}
  • 400g=>{包装:1件,重量:400,单位:g}
  • 400g=>{包装:1件,重量:400,单位:g}
  • 我尝试了以下代码

    const re = /^(\d+x)?([\d,]+)([a-z]+)/gm;
    
    str.split(",").forEach(v => {
       const value = v.replace(/\s/g, "")
       let arr = [...value.matchAll(re)];
       console.log(arr[0]);
    })
    
    使用上述代码的输入字符串的结果

  • 12xATG370g,12x720ml,1glas=0.97,1kg=2.03
  • [“12x”,未定义,“12”,“x”] [“12x720ml”、“12x”、“720”、“ml”] 未定义 [“1kg”,未定义,“1”,“kg”]

  • versch。分拣机,2 x 250克,1个包装=1-100克=0.40
  • 未定义[“2x250g”、“2x”、“250”、“g”]未定义[“100g”,未定义, “100”,“g”]

    等等

    我无法确定如何提取所需的数据,以及这是否可能,因为所需数据在字符串中的位置不正确

    编辑(新)

    Wiktor Stribiżew解决方案适用于上述情况

    新要求-

  • 12xATG370g,12x720ml,1glas=0.97,1kg=2.03
  • versch。分拣机,2 x 250克,1个包装=1-100克=0.40
  • 2 x 950克,1包=4.98,1公斤=4.47,tiefgekühlt
  • versch。分拣机,2 x 500克,1个包装=0.65,1千克=1。-
  • 3,5%Fett,3 x 1升,1包=0.76,1升=0.60
  • Krönung Balance gemahlen Order Krönung Aroma ganze Kaffeebohnen,400-500克,1千克=6.44
    范围
  • versch。分拣机,400克,1千克=5.60
  • 100-400g,versch。分拣机,1千克=5.60
    范围
  • 预期结果

  • 12x720ml=>{pack:12,minweight:720,maxweight:0,unit:ml}
  • 2x250克=>{包装:2,最小重量:250,最大重量:0,单位:克}
  • 2 x 950克=>{包装:2,最小重量:950,最大重量:0,单位:克}
  • 2x500克=>{pack:2,minweight:500,maxweight:0,unit:g}
  • 3x1升=>{包装:3,最小重量:1,最大重量:0,单位:升}
  • 400-500g=>{包装:1,最小重量:400,最大重量:500,单位:g}
  • 400g=>{pack:1,minweight:400,maxweight:0,unit:g}
  • 100-400g=>{包装:1,最小重量:100,最大重量:400,单位:g}
  • 你可以用

    const arr=['12 x ATG 370 g,12 x 720 ml,1 Glas=0.97,1 kg=2.03','versch.Sorten,2 x 250 g,1 Packung=1.-,100 g=0.40','2 x 950 g,1 Packung=4.98,1 kg=4.47,tiefgekühlt','versch Sorten.Sorten,2 x 500 g,1 Packung=0.65,1 kg=1.-','3,5%费特,3 x 1升,1 Packung=0.76,1升=0.60','Krogenze-Genode-Krganung-Kaf'feebohnen,400-500克,1千克=6.44',“相对分拣机,400克,1千克=5.60',“100-400克,相对分拣机,1千克=5.60'”;
    常数re=/(?:,\s*|^)(?:(\d+)\s*x\s*)?(\d+(?:\s*-\s*\d+)\s*([a-zA-Z]+)(?:$,)/;
    arr.forEach(str=>{
    让[u,包装,重量,单位]=str.匹配(re);
    包装=包装| | 1;
    log(str,{'pack':pack,'weight':weight,'unit':unit});
    
    })
    您的字符串中可以有多个有效的子字符串吗?类似于“
    1 x 1 mg,1000 l
    ”?为什么不使用两个单独的正则表达式?@PM77-1我非常怀疑,但目前我可以假设没有。请详细说明您的评论
    为什么不使用两个单独的正则表达式?
    超级感谢。效果非常好。还有一个问题-请查看编辑后的问题(最后一节)@SaurabhKumar只需添加一个可选组,
    (?:\s*-\s*\d+)