我有一个string
,我想使用.split()
函数将其分成 chunks 。
示例字符串
59 Samuël 1 en 2 // Example 1
1 Saul omgekomen door het zwaard // Example 2
622 Koningen 1 tot 10 // Example 3
预期产量
['59', 'Samuël 1 en 2'] // Output example 1
['1', 'Saul omgekomen door het zwaard'] // Output example 2
['622', 'Koningen 1 tot 10'] // Output example 3
我根据其他主题中的答案尝试了以下代码。
var example_1 = '59 Samuël 1 en 2';
var example_2 = '1 Saul omgekomen door het zwaard';
var example_3 = '622 Koningen 1 tot 10';
console.log(example_1.split(/(\d+)/));
console.log(example_2.split(/(\d+)/));
console.log(example_3.split(/(\d+)/));
但是输出不是预期的输出,例如。 ['59', 'Samuël 1 en 2']
有人可以指出我正确的方向吗?
答案 0 :(得分:1)
如OP在评论中所述,预期的输入位于99 string
这可以在正则表达式中表示为2个捕获组。
第一个-> \d\d
2个数字..
第二个-> .*
其他。.
然后您可以将其与捕获组结合起来。
因此最终的正则表达式为/(\d\d) (.*)/
如果数字的长度可能不是2位数字,那么您可能需要\d+
。
这是99 string
console.log("59 Samuël 1 en 2".match(/(\d\d) (.*)/).slice(1));
如果数字可以是单个,甚至是3,那么可能会更好。
console.log("59 Samuël 1 en 2".match(/(\d+) (.*)/).slice(1));
console.log("159 Samuël 1 en 2".match(/(\d+) (.*)/).slice(1));
console.log("9 Samuël 1 en 2".match(/(\d+) (.*)/).slice(1));
答案 1 :(得分:0)
我认为使用带有“。+”的捕获组来包含之后的所有内容都应该起作用。
var string = '59343 Samuël 1 en 2';
console.log(string.split(/\d+(.+)/)[1].replace(' ', ''));
答案 2 :(得分:0)
您可以使用捕获括号,然后过滤出空的匹配项
module A
mutable struct MyType
variable
end
end
module B
using ..A: MyType
end
答案 3 :(得分:0)
只要您可以指望在第一个数字序列后留一个空格,就可以解决此问题。它不是很漂亮,但应该非常清楚,因此,如果您愿意,可以提高效率。
(请注意,按数字分割会删除数字,这并不是根据预期输出实际要查找的内容。)
var str = '59 Samuël 1 en 2';
var arr = str.split(" ");
let i = 0, firstIntPosInArr = -1;
for(; i < arr.length; i++){
if(parseInt(arr[i])){
firstIntPosInArr = i;
console.log(`${i}: ${arr[i]}`);
break;
}
}
console.log(firstIntPosInArr);
let firstPart = [], secondPart = [], output = [];
for(i = 0; i < arr.length; i++){
if(i <= firstIntPosInArr){ firstPart.push(arr[i]); }
else secondPart.push(arr[i]);
}
console.log("1:" + firstPart);
console.log("2:" + secondPart);
output.push(firstPart.join(' '));
output.push(secondPart.join(' '));
console.log(output);
答案 4 :(得分:-1)
如果您不局限于使用split
,则可以将其与slice结合在一起并加入以获得所需的结果。
[
string.split(/(\d+)/)[0],
string.split(/(\d+)/).slice(1).join(' ')
]
另一种替代方法是使用仅与第一个数字匹配的RegExp,但这也需要与filter
结合使用,因为它为''
创建了一个匹配项,作为第一个条目。输出数组。
string.split(/^(\d*) /).filter(Boolean);
编辑: 最佳最终解决方案:
要使用单个RegExp和split
进行求解,可以使用以下命令:
string.split(/[^\d](.*\d*)$/, 2);
此RegExp将分割(并捕获)从最后一位到第一位之前的整个字符串,即“Samuël1 en 2” 。此方法仍然在split
数组的末尾产生一个多余的空字符串,这就是为什么必须使用限制器的原因。