基本上我想这样做:
我得到了一个字符串"myVariableName"
并将其变成:["my", "variable", "name"]
我尝试使用Regex进行此操作,但是看来我的结尾阵列中得到了很多不确定的。在这种情况下,可变名称的两种可能情况是骆驼案和上蛇案例。
const matchVariableNames = /(b[a-z]+)|([A-Z][a-z]+)|(b[A-Z]+)|(_[A-Z]+)/g;
const variableName = 'myVariable';
let words = [];
let regexMatches;
while (regexMatches = matchVariableNames.exec(variableName)) {
regexMatches.forEach((match) => {
words.push(match);
});
};
输出:
["my", "my", undefined, undefined, undefined, "Variable", undefined, "Variable", undefined, undefined]
undefined
您可以使用带有大写字母的正面lookahead。然后仅映射较低的案例字母。
var string = 'myVariableName',
array = string.split(/(?=[A-Z])/).map(a => a.toLowerCase());
console.log(array);
我认为正则表达式不适合此。(我不接受正则表达式以识别带有大写字母的骆驼句单词,因为该问题不要求正则表达式persé(。
我阅读的方式是您要解析用骆驼写的单词。我立即想象特殊情况,例如"DOMElement
和"PDFParser"
。我希望输出为[ "DOM", "Element" ]
和[ "PDF", "Parser" ]
。我认为我们可以编写这样的函数。
function parseWordsFromCamelCaseString(string) {
var i, words, last_word_char, last_case, current_case;
words = [];
last_word_start = 0;
last_case = null; // false=lower, true=upper
for (i = 0; i < string.length; i += 1) {
current_case = string[i].toUpperCase() === string[i];
if (last_case !== null && current_case !== last_case) {
if (current_case === true) { // lowercase to uppercase transition
words.push(string.substring(last_word_start, i));
last_word_start = i;
} else { // uppercase to lowercase transition
if (last_word_start < i - 1) {
words.push(string.substring(last_word_start, i - 1));
}
last_word_start = i - 1;
}
}
last_case = current_case;
}
if (last_word_start < i - 1) {
words.push(string.substring(last_word_start, i));
}
return words;
}
console.log(parseWordsFromCamelCaseString("fooBar"));
console.log(parseWordsFromCamelCaseString("parseWordsFromCamelCaseString"));
console.log(parseWordsFromCamelCaseString("DOMElement"));
console.log(parseWordsFromCamelCaseString("fooDOMElement"));
输出
["foo", "Bar"]
["parse", "Words", "From", "Camel", "Case", "String"]
["DOM", "Element"]
["foo", "DOM", "Element"]
它也适用于"foo"
(无案例过渡(和""
(空字符串(。
我已经创建了这个:
x = 'myVariableName';
const isUpper = e => (e === e.toUpperCase());
[].reduce.call(x, (words, letter, i) => {
if(isUpper(letter)) words.push([letter]);
else {
let length = words.length-1,
word = words[length];
words[length] = word+letter;
}
return words;
}, [[]]);
返回["my", "Variable", "Name"]
它非常优雅吗?我们可以为此而战,但我敢肯定,比您的言论更多。:p