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

javascript regex to split at the point where lowercase changes to uppercase

我看过 this link and this link 和其他一些人,但 none 似乎只用 纯正则表达式 解决了这个问题(...不使用替换, ETC)。

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

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

这是我的尝试:

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

[ 'Vehicle Service', 'sAUTOMATED GAS DISPENSER' ]

我在下面有一个解决方案,但我不喜欢它,因为它使用了额外的 'replace' 方法。我正在寻找基于纯正则表达式的拆分。

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

[ 'Vehicle Services', 'AUTOMATED GAS DISPENSER' ]

更新: 我的要求只是按照 post 中指定的方式拆分输入字符串 - 如图所示,一旦大小写变为大写,它就保持大写直到结束。

这并不完美,但这是我能想到的最好的结果,可以在两者之间没有任何标识符的情况下进行一次拆分。

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

使用 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

如果您的用例是混合大小写字符串后跟全大写字符串,那么一个想法是使用 match 而不是 split,然后从捕获的组中读取结果:

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER';
var result = str.match(/(.*[a-z])((?=[A-Z]).*)/);

console.log([result[1], result[2]]);

JavaScript 不支持 lookbehinds,所以如果你试图在两个字符之间的空 space 上拆分,则无法验证空 [=23= 之前的字符] 是一个特定的字符。但是捕获括号也可以将元素附加到 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 有一个内置参数来限制结果数组的元素数量,因此我们将使用 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"]

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

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