我查看了this link和this 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('_'))
['车辆服务','自动气体分配器']
更新:我的要求只是按照帖子中的指定拆分输入字符串 - 如图所示,一旦翻转为大写,它将保持大写直到结束。
答案 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"]