如何使用 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 循环遍历字符串并将其分段为数组?的主要内容,如果未能解决你的问题,请参考以下文章