javascript正则表达式在小写更改为大写的位置拆分

我已经看过
this link
this link以及其他几个但是它们似乎都没有用纯正则表达式解决这个问题(…不使用替换等).

输入字符串:“Vehicle ServicesAUTOMATED GAS DISPENSER”

我想要的输出是:[“车辆服务”,“自动气体分配器”]

这是我的尝试:

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER'
console.log(str.split(/(?=[a-z][A-Z])/))

[ ‘Vehicle Service’, ‘sAUTOMATED GAS DISPENSER’ ]

我有一个解决方案,但我不喜欢它,因为它使用了额外的’替换’方法.我正在寻找一个纯正的基于正则表达式的分裂.

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER'
console.log(str.replace(/([a-z])(?=[A-Z])/, "$1_").split('_'))

[ ‘Vehicle Services’, ‘AUTOMATED GAS DISPENSER’ ]

更新:我的要求只是按照帖子中的指定拆分输入字符串 – 如图所示,一旦翻转为大写,它将保持大写直到结束.

最佳答案 JavaScript不支持lookbehinds,所以如果你试图拆分两个字符之间的空白区域,那么在空白空间是特定字符之前无法验证字符.但是捕获括号也可以通过拆分将元素附加到结果数组中.因此,您可以创建这样的解决方案:

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER'
var ar = str.split(/(.*[a-z])(?=[A-Z])/);
//result is ["", "Vehicle Services", "AUTOMATED GAS DISPENSER"]
ar.shift();//get rid of the leading empty element
console.log(ar);//["Vehicle Services", "AUTOMATED GAS DISPENSER"]

另一种方法是在结果数组的末尾使用空匹配而不是开头,因为split有一个内置参数来限制结果数组的元素数,因此我们使用AUTOMATED GAS DISPENSER作为分隔符,你在捕获括号之间放置,然后我们在结果数组的末尾有空元素,我们可以简单地剥离而不调用pop:

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER'
var ar = str.split(/((?:[A-Z]{2,}\s*)+)/,2);
console.log(ar);//["Vehicle Services", "AUTOMATED GAS DISPENSER"]

但是如果你能想出一个逻辑,它可以识别一个空的空间来单独使用前瞻,而不必向后看,那么你可以写下这样的东西:

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER'
var ar = str.split(/(?=AUTO)/);
console.log(ar);//["Vehicle Services", "AUTOMATED GAS DISPENSER"]
点赞