我有一个文本文件,每一行都是一个字符串。
最极端的可能是这样的:
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", "", "", "", "", "", "", ""]
感谢任何想法!
答案 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);