在单个单词中匹配UPPERCASE,PascalCase和camelCase

时间:2019-11-21 13:44:28

标签: javascript regex

比方说,我有一个字符串testTESTCheckTESTAnother,我想将它分成几个单词,例如["test", "TEST", "Check", "TEST", "Another"]

输入:

仅允许[A-Za-z]个字符

testTESTCheckTESTAnother

代码:

我对正则表达式的最佳尝试是:

"testTESTCheckTESTAnother".match(/^[a-z]+|[A-Z][a-z]*/g)
Output: ["test", "T", "E", "S", "T", "Check", "T", "E", "S", "T", "Another"]

我尝试了否定的前瞻性,但它也不起作用:

"testTESTCheckTESTAnother".match(/?![A-Z][a-z]+)[A-Z]+/g)
Output: ["TESTC", "TESTA"]

所需的输出:

["test", "TEST", "Check", "TEST", "Another"]

其他投入产出:

input: "ITest"
output: ["I", "Test"]

input: "WHOLETESTWORD"
output: ["WHOLETESTWORD"]

input: "C"
output: ["C"]

2 个答案:

答案 0 :(得分:2)

正则表达式

/[a-z]+|[A-Z]+(?=[A-Z]|$)|([A-Z][a-z]+)/g

Demo

[a-z]+-小写

[A-Z]+(?=[A-Z]|$)-大写

([A-Z][a-z]+)- TitleCase

let string = "testTESTCheckTESTAnother"

console.log(string.match(/[a-z]+|[A-Z]+(?=[A-Z]|$)|([A-Z][a-z]+)/g))

答案 1 :(得分:1)

使用以下正则表达式:^[a-z]+|((?![A-Z][a-z])[A-Z])+|[A-Z][a-z]+

https://regex101.com/r/5r8MzJ/1上查看它的运行情况

说明。我们将捕获三种替代模式。

  1. ^[a-z]+

仅在字符串的开头接受一系列小写字母。

  1. ((?![A-Z][a-z])[A-Z])+

接受一系列大写字母,但最后一个字母除外,如果后面跟一个小写字母

  1. [A-Z][a-z]+

接受一系列的一个大写字母和至少一个小写字母。