Javascript 有没有一种优雅的方法可以将变量名中的单个单词提取到数组中?
基本上我想这样做: 我得到一个字符串Javascript 有没有一种优雅的方法可以将变量名中的单个单词提取到数组中?,javascript,arrays,regex,Javascript,Arrays,Regex,基本上我想这样做: 我得到一个字符串“myVariableName”并将其转换为:[“我的”、“变量”、“名称”] 我试着用正则表达式来做这件事,但我的结束数组中似乎有很多未定义的项。在这种情况下,变量名的两种可能的情况是camel大小写和supper snake大小写 const matchVariableNames = /(\b[a-z]+)|([A-Z][a-z]+)|(\b[A-Z]+)|(_[A-Z]+)/g; const variableName = 'myVariable'; l
“myVariableName”
并将其转换为:[“我的”、“变量”、“名称”]
我试着用正则表达式来做这件事,但我的结束数组中似乎有很多未定义的项。在这种情况下,变量名的两种可能的情况是camel大小写和supper snake大小写
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
您可以使用大写字母的正向前瞻。然后只映射小写字母
var string='myVariableName',
array=string.split(/(?=[A-Z])/).map(A=>A.toLowerCase());
console.log(数组)代码>您可以使用大写字母的正向前瞻。然后只映射小写字母
var string='myVariableName',
array=string.split(/(?=[A-Z])/).map(A=>A.toLowerCase());
console.log(数组)代码>我认为正则表达式不适合这种情况。(我不接受重复,因为问题不需要正则表达式)
按照我的阅读方式,你想要解析用camelcase写的单词。我马上想象一些特殊情况,比如“domeElement
和“PDFParser”
。我希望输出是[“DOM”,“Element”]
和[“PDF”,“Parser”]
。我认为我们可以编写一个这样的函数
函数解析词fromcamelCaseString(string){
变量i、单词、最后一个单词、最后一个大小写、当前大小写;
单词=[];
最后一个单词开始=0;
last_case=null;//false=lower,true=upper
对于(i=0;i log(parseWordsFromCamelCaseString(“FoodElement”);
我认为正则表达式不适合这种情况。(我不接受重复,因为这个问题不需要正则表达式)
按照我的阅读方式,你想要解析用camelcase编写的单词。我马上想象一些特殊情况,如“DOMElement
和“PDFParser”
。我希望输出是[“DOM”,“Element”]
和[“PDF”,“Parser”]
。我想我们可以写一个这样的函数
函数解析词fromcamelCaseString(string){
变量i、单词、最后一个单词、最后一个大小写、当前大小写;
单词=[];
最后一个单词开始=0;
last_case=null;//false=lower,true=upper
对于(i=0;i我创建了这个:
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;
}, [[]]);
返回[“我的”、“变量”、“名称”]
它很优雅吗?我们可以为此而战,但我肯定比你的RegExp更重要P我创建了这个:
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;
}, [[]]);
返回[“我的”、“变量”、“名称”]
它很优雅吗?我们可以为此而战,但我肯定比你的RegExp更重要P“myVariableName”.match(/((?:^[A-Z])[A-Z]+)/g)
从技术上讲,一些非alpha字符可以作为var名称,但这可能足够了,这取决于您的var命名约定或更好的副本:控制台.log(“myVariableName”.replace(/^[A-Z][A-Z]/g,函数(v,i){return(i==0?”:“”)+v.toLowerCase();}).split(“”)
从技术上讲,一些非alpha字符可以作为变量名称,但这可能就足够了,这取决于您的变量命名约定或更好的副本:控制台.log(“myVariableName.replace”(/^[A-Z][A-Z]/g,函数(v,i){return(i==0?“:”)+v.toLowerCase();}.split(“”)
它在输入时中断,如“myPDFFile”
。它返回[“my”、[“p”]、[“D”]、[“F”]、“File”]
它在输入时中断,如“myPDFFile”
。它返回[“my”、[“p”]、[“D”、[“F”]、“File”]
那么你认为是重复的吗?@mplungjan我不明白为什么。没有非正则表达式的答案。而且没有一个能正确处理我概述的(不太)特殊情况。那么你认为是重复的吗?@mplungjan我不明白为什么。没有非正则表达式的答案。而且没有一个能正确处理这个问题(并非如此)我概述的特殊情况。