如何使用 RegExp 循环遍历字符串并将其分段为数组?

Posted

技术标签:

【中文标题】如何使用 RegExp 循环遍历字符串并将其分段为数组?【英文标题】:How to loop through and segment a string into an array using a RegExp? 【发布时间】:2020-02-22 13:35:12 【问题描述】:

我在 Zapier 中大量使用自定义 JS 代码。当数组导入到这一步时,Zapier 将其转换为文字字符串,即:

['BigBoatBob,XL-1','LittleBoatMike,M-2','SunkBoatCheney,XS-9']

变成:

'BigBoatBob,XL-1,LittleBoatMike,M-2,SunkBoatCheney,XS-9'

我创建了一个函数来解析数组项(考虑文本逗号),但它看起来非常非常草率。有人有任何建议来改进/缩短/使看起来更专业吗?感谢您帮助我提高我的能力:)

var array = splitArray('BigBoatBob, XL-1,LittleBoatMike, M-2,SunkBoatCheney, XS-9');

function splitArray(x) 
  const pos = [];
  const POS = [];
  const res = [];
  for (var i = 0; i < x.length; i++) 
    if (x[i] == ',') pos.push(i);
  
  for (i = 0; i < pos.length; i++) 
    let a = x.slice(pos[i]);
    if (!a.startsWith(', ')) POS.push(pos[i]);
  
  POS.push(x.length);
  POS.unshift(0);
  for (i = 0; i < POS.length - 1; i++) 
      res.push(x.slice(POS[i], POS[i+1]));
  
  return res.map(x => 
    if (x.startsWith(',')) 
      return x.slice(1);
     else 
      return x;
    
  );

console.log(array);

【问题讨论】:

"Zapier 将其转换为文字字符串" 我怀疑还有其他东西正在这样做,因为您显示的是转换 javascript 字符串数组的默认结果成一个字符串。 【参考方案1】:

如果你可以依靠逗号后的空格字符串中并且依靠他们的not是一个之间 em> 字符串,您可以使用 split 和正则表达式 /,(?! )/ 表示“逗号 not 后跟空格:”

const str = 'BigBoatBob, XL-1,LittleBoatMike, M-2,SunkBoatCheney, XS-9';
const array = str.split(/,(?! )/);
console.log(array);

如果您不能依赖它,但您可以依赖 XL-1 等格式,您可以使用 exec 循环(或使用 up-to -date JavaScript 引擎或 polyfill,使用 matchAll):

const str = 'BigBoatBob, XL-1,LittleBoatMike, M-2,SunkBoatCheney, XS-9';
const array = [];
const rex = /(.*?,\s*[A-Z]1,2-\d)\s*,?/g;
let match;
while ((match = rex.exec(str)) !== null) 
    array.push(match[1]);

console.log(array);

正则表达式/(.*?,\s*[A-Z]1,2-\d)\s*,?/g表示:

.*? 任意数量任意字符,不贪心 ,逗号 \s* 零个或多个空白字符 [A-Z]1,2 A-Z 范围内的一两个字母 -破折号 \d 一个数字(如果可以有多个,请使用 \d+) 以上所有内容都在一个捕获组中 ,? 后面的可选逗号

【讨论】:

我是个白痴。你是我的英雄!这要好得多(而且更短)。谢谢! @SlavenMan'sGym - 我不能对你称自己为白痴的评论投赞成票。 :-) 很高兴有帮助!【参考方案2】:

我会使用 Array.reduce:

var s = 'BigBoatBob, XL-1,LittleBoatMike, M-2,SunkBoatCheney, XS-9'
var result = s.split(',').reduce((acc, curr, i) => 
  if(i % 2 == 0)  acc[i] = curr 
  else  acc[i - 1] += curr 
  return acc
, []).filter(x => x)
console.log(result)

【讨论】:

【参考方案3】:

简写,

function splitIt(str) 
return str.split(',').reduce((a,v,i)=>((i % 2 == 0)?a.push(v):a[a.length-1]=a[a.length-1]+","+v,a),[]);


// Example

let str = `BigBoatBob, XL-1,LittleBoatMike, M-2,SunkBoatCheney, XS-9`;

console.log(splitIt(str));

【讨论】:

以上是关于如何使用 RegExp 循环遍历字符串并将其分段为数组?的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历两个字符串数组并将它们设置为对象属性

JS如何遍历字符串

循环遍历数组,并将子JSON转换为observablearray?

我如何遍历表单数组并将其值设置为打字稿中的另一个数组?

分段错误:循环打印时为 11

如何将查询结果转换为字符串并将其插入表行