如何在javascript中多次拆分字符串

时间:2017-05-25 00:37:52

标签: javascript string

我有一个文本文件,每一行都是一个字符串。

最极端的可能是这样的:

A01B01C01D100E500F100.00G100.00H100.00

关于可能性的一些信息:

  • 每个字符串将至少包含其中一个字母和数字
  • 字母后面的数字可以是小数点后的任意位数和位数。
  • 字母并不总是按顺序排列

数据的另一个例子:

A01B400C62.578D77.297
C62.409D77.222
C62.259D77.113
C62.135D76.975
C62.042D76.815
C61.985D76.638
C61.973D76.529
A03B10000
A0C62.760 D77.336
A0E3.000
A01F400E0
A01B400E-0.100

我想做的是在每个字母处拆分字符串,然后将所有数字分开,直到下一个字母。结果如下:

A01, B01, C01, D100, E500, F100.00, G100.00, H100.00

我尝试过很多东西,而我最接近的就是这个

dicedLine = myLine.split(/[ABCDEFGH]/)

这让我关注我想要的东西,除了我发现如果你有一个字符串在搜索中不包含其中一个字母,那么结果就不是我想要的了。

例如这样的一行:

A30

会给我这样的结果:

["", "30"]

我真的想要这样的结果:

["A30", "",  "",  "", "", "", "", ""]

感谢任何想法!

3 个答案:

答案 0 :(得分:2)

您可以使用positive lookahead断言特定字符的存在,而不实际使用它:

codes = [
  "A01B400C62.578D77.297",
  "C62.409D77.222",
  "C62.259D77.113",
  "C62.135D76.975",
  "C62.042D76.815",
  "C61.985D76.638",
  "C61.973D76.529",
  "A03B10000",
  "A0C62.760 D77.336",
  "A0E3.000",
  "A01F400E0",
  "A01B400E-0.100",
];

console.log(codes.map(code => code.split(/ *(?=[A-Z])/)));

注意我还添加了 *以删除空格(如果有的话)。

答案 1 :(得分:0)

  

我真的想要这样的结果:

     

["A30", "", "", "", "", "", "", ""]

如果这些字母是有序的,可以通过捕获自己组中的每个字母+数字来轻松完成,如下所示:



let re = /(A[^A-Z]+)?(B[^A-Z]+)?(C[^A-Z]+)?(D[^A-Z]+)?(E[^A-Z]+)?(F[^A-Z]+)?(G[^A-Z]+)?(H[^A-Z]+)?/;

console.log(re.exec("A01B01C01D100E500F100.00G100.00H100.00").slice(1));
console.log(re.exec("C30").slice(1));




不匹配的组会生成undefined数组条目。如果需要,可以很容易地将它们映射到空字符串。

  

字母并不总是按顺序

您需要将给定正则表达式中的单个字母替换为其通用组[A-Z]

但是,你的问题对于无序字母是模棱两可的。 "C30B30"会产生["", "B30", "C30", "", "", "", "", ""]吗?还是["B30", "C30", "", "", "", "", "", ""]?如果没有更多规范,我们无法回答问题的这一部分。

答案 2 :(得分:0)

您可以使用匹配而非拆分轻松完成此操作。它是一个简单的正则表达式,因此可能更兼容。请注意,如果未找到匹配项,则返回 null 而不是空数组。



var data = [
 'A01B400C62.578D77.297',
 'C62.409D77.222',
 'C62.259D77.113',
 'C62.135D76.975',
 'C62.042D76.815',
 'C61.985D76.638',
 'C61.973D76.529',
 'A03B10000',
 'A0C62.760 D77.336',
 'A0E3.000',
 'A01F400E0',
 'A01B400E-0.100'
];

var result = data.map(s => s.match(/[a-z][^a-z]+/gi));

console.log(result);