Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有一种优雅的方法可以将变量名中的单个单词提取到数组中?_Javascript_Arrays_Regex - Fatal编程技术网

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;ilog(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我不明白为什么。没有非正则表达式的答案。而且没有一个能正确处理这个问题(并非如此)我概述的特殊情况。