2017-06-06 29 views
1

基本上我想这样做:有没有一种优雅的方式将变量名称中的单词提取到数组中?

我得到一个字符串"myVariableName"并把它变成:["my", "variable", "name"]

我试着这样做使用正则表达式,但我得到在我结束数组很多undefineds的好像。在这种情况下,变量名称的两种可能情况是驼峰案和上蛇案。

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 
+0

' “myVariableName” .match(/((:^ | [AZ])[AZ] +)/ G?)'技术上的一些非字母字符作为VAR名接受的,但是这取决于这可能就够你var命名约定 –

+0

或更好的重复:https://stackoverflow.com/questions/13720256/javascript-regex-camelcase-to-sentence – mplungjan

+0

'console.log( “myVariableName” .replace(/^[az] | [AZ]/g,函数(v,i){ )' – mplungjan

回答

2

你可以用用大写字母积极的前瞻。然后只映射小写字母。

var string = 'myVariableName', 
 
    array = string.split(/(?=[A-Z])/).map(a => a.toLowerCase()); 
 
    
 
console.log(array);

2

我不认为正则表达式是非常适合这一点。 (我不接受Regular expression to identify CamelCased words with leading uppercase letter作为重复,因为问题没有要求正则表达式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"(任何情况下的过渡)和""(空字符串)。

+0

你是否会识别[javascript-regex-camelcase-to-sentence](https://stackoverflow.com/questions/13720256/javascript-regex-camelcase-to-sentence)作为重复呢? – mplungjan

+0

@mplungjan我不明白为什么。没有非正则表达式答案。他们都没有正确处理我概述的(不那么)特殊情况。 – Halcyon

-1

我创造了这个:

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"]

是它非常优雅?我们可以争取,但肯定比您的RegExp更多。 :P

+0

它像输入'myPDFFile'一样中断输入。它返回'[“my”,[“p”],[“D”],[“F”],“File”]' – Halcyon

相关问题