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

时间:2016-07-10 05:28:16

标签: javascript regex-lookarounds

我查看了this linkthis link以及其他一些人,但他们似乎都没有用纯正则表达式解决这个问题(...不使用替换等) 。

输入字符串:"Vehicle ServicesAUTOMATED GAS DISPENSER"

我想要的输出是:["Vehicle Services", "AUTOMATED GAS DISPENSER"]

这是我的尝试:

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

  

['车辆服务','自动气体分配器']

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

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

  

['车辆服务','自动气体分配器']

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

4 个答案:

答案 0 :(得分:1)

这并不完美,但它是我能想到的最好的一次,而两者之间没有任何标识符。

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER';
var res = str.split(/([A-Z\s]+$)/);
console.log(res);

唯一的问题是它留下了一个带有空字符串的额外数组元素。如果你总是只想要两个数组元素,你可以把它弹出或者忽略它。

的jsfiddle https://jsfiddle.net/2ex4cuno/4/

正如@rid所说,你可以将它添加到分割中以获得两个结果(同样,假设你总是只期望2,我认为你会这样)。

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER';
var res = str.split(/([A-Z\s]+$)/, 2);
console.log(res);

答案 1 :(得分:1)

如果您的用例是一个混合大小写字符串后跟一个全大写字符串,那么想法是使用split而不是var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER'; var result = str.match(/(.*[a-z])((?=[A-Z]).*)/); console.log([result[1], result[2]]);,然后从捕获的组中读取结果:< / p>

Undefined variable: gridColumns

答案 2 :(得分:0)

使用RegExp.exec函数的其他方法:

var str = "Vehicle ServicesAUTOMATED GAS DISPENSER",
    parts = /([a-zA-Z ]+?)([A-Z ]+)$/.exec(str);

console.log(parts[1]);  // Vehicle Services
console.log(parts[2]);  // AUTOMATED GAS DISPENSER

答案 3 :(得分:0)

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

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有一个内置参数来限制结果数组的元素数,因此我们使用{{1作为分隔符,你在捕获括号之间,然后我们在结果数组的末尾有空元素,我们可以简单地去除而不调用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"]