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"]
我看过 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"]