根据第一个出现的数字分割字符串

时间:2019-01-15 10:36:19

标签: javascript

我有一个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']

有人可以指出我正确的方向吗?

5 个答案:

答案 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数组的末尾产生一个多余的空字符串,这就是为什么必须使用限制器的原因。