当前位置: 首页 > 知识库问答 >
问题:

JavaScript正则表达式在小写变为大写时拆分

娄鹤轩
2023-03-14

我已经查看了此链接和此链接以及其他几个链接,但它们似乎都无法仅使用纯正则表达式解决此问题(...不使用替换等)。

输入字符串:“车辆服务自动气体分配器”

我想要的输出是:< code>[“车辆服务”、“自动加油机”]

这是我的尝试:

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('_'))

['车辆服务','自动加气机']

更新:我的要求只是简单地按照帖子中的说明分割输入字符串——如图所示,一旦大小写转换为大写,它将一直保持大写直到结束。

共有3个答案

吴高畅
2023-03-14

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

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 有一个内置参数来限制结果数组的元素数量,因此我们将使用 AUTOMATIC 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"]
居飞扬
2023-03-14

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

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

console.log([result[1], result[2]]);
容飞掣
2023-03-14

这并不完美,但对于两者之间没有任何标识符的单个拆分来说,这是我能想到的最好的方法。

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

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

https://jsfiddle.net/2ex4cuno/4/小提琴

如@rid所述,您可以将其添加到拆分中,以便只获得两个结果(再次,假设您总是只期望 2,我假设您会)。

var str = 'Vehicle ServicesAUTOMATED GAS DISPENSER';
var res = str.split(/([A-Z\s]+$)/, 2);
console.log(res);
 类似资料:
  • 问题内容: 所以我有一个像 2000cc车辆翻新发动机 我想把它变成 2000CC车辆翻新发动机 资本CC于2000CC。我显然不能这样做,因为它将所有出现的cc都替换为大写版本,因此加速器一词将成为加速器。在我的情况下,前四位将始终是四位,后跟字母cc,因此我认为可以使用正则表达式来完成。 我的问题是,在Java中,当cc跟随4位数字时如何将cc转换为CC并获得我期望的结果? 问题答案: 如果只

  • 问题内容: 我想使用JavaScript从我的URL中提取查询字符串,并且想要对查询字符串名称进行不区分大小写的比较。这是我在做什么: 但是上面的代码进行区分大小写的搜索。我尝试过,但没有帮助。知道如何实现吗? 问题答案: 您可以添加“ i”修饰词,表示“忽略大小写”

  • 问题内容: 我想在Go中使用regexp交换案例。我试图在Javascript中使用类似的方法,但是我不知道如何使Go理解$符号。 这是我的尝试。它适用于将所有高位转换为低位,反之亦然,但是我想做的是同时交换每个字母。例如,“ Hello” —>“ hELLO” 以下是我用Javascript编写的完美代码。 问题答案: 您不能(我认为)使用正则表达式执行此操作,但是使用可以很简单。

  • 问题内容: 我正在尝试使用以下程序使用正则表达式删除字符串中的某些单词。它可以正确删除,但只考虑大小写。如何使其不区分大小写。我坚持使用方法,但是没有用。 输出: 问题答案: 您需要将模式中要区分大小写的部分放在 前面 : 看见 我已将要删除的关键字周围的空格替换为单词边界()。之所以出现问题,是因为可能有两个关键字一个接一个地被一个空格隔开。 如果仅当关键字被 空格 包围时才想删除它们,则可以使

  • 正则获取指定字符到下一个大写字符之间的内容

  • 我需要查找以三个小写字母开头的文件,但由于某种原因,我遇到了不希望的不区分大小写的行为。我正在使用带有 -regex 选项的查找,但它甚至可以找到以大写字母开头的文件。 打印内容与以下内容相同: 如果我不使用一系列字符,而是使用一个字符,则工作方式与敏感字符相同,只打印小写文件。 我尝试过使用不同的正则表达式类型,结果是相同的。 此外,白鹭似乎也起作用: 为什么在使用字符范围时“find-rege