繁体   English   中英

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

[英]Split string based on the first occurring number javascript

我有一个string ,我想使用.split()函数拆分为多个

字符串示例

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']

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

正如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)); 

我认为使用带有“。+”的捕获组来包含之后的所有内容都应该可行。

 var string = '59343 Samuël 1 en 2'; console.log(string.split(/\\d+(.+)/)[1].replace(' ', '')); 

您可以使用捕获括号,然后过滤出空的匹配项

 const str = '50 Samuël 1 en 2'; console.log(str.split(/(\\d+)(.+)/).filter(e => e)); 

只要您可以指望在第一个数字序列之后有一个空格,就可以这样做。 它不是很漂亮,但是应该很清楚,因此,如果您愿意,可以提高效率。

(请注意,按数字分割会删除数字,这并不是根据预期输出实际要查找的内容。)

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);

如果您不希望仅使用split ,则可以将其与slice结合在一起并加入以实现所需的结果。

[
  string.split(/(\d+)/)[0],
  string.split(/(\d+)/).slice(1).join(' ')
]

另一种选择是使用仅与第一个数字匹配的RegExp,但这也需要与filter结合使用,因为它会为输出数组中的第一个条目创建一个匹配项''

string.split(/^(\d*) /).filter(Boolean);

编辑: 最佳最终解决方案:

要使用单个RegExp进行splitsplit ,可以使用以下命令:

string.split(/[^\d](.*\d*)$/, 2);

此RegExp将拆分(并捕获)从最后一位到第一位之前的整个字符串,即“Samuël1 en 2” 此方法仍在split数组的末尾产生多余的空字符串,这就是为什么需要限制器的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM