Есть ли элегантный способ извлечь отдельные слова из имен переменных в массив?

1

В основном я хочу это сделать:

Я получаю строку "myVariableName" и превращаю ее в: ["my", "variable", "name"]

Я попытался сделать это с помощью регулярного выражения, но в моем конечном массиве я получаю много неопределенных значений. В этой ситуации двумя возможными случаями для имен переменных являются верблюжий случай и верхний змеиный футляр.

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
Теги:
arrays

3 ответа

2
Лучший ответ

Вы могли бы использовать положительное выражение с прописными буквами. Затем отобразите только строчные буквы.

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

Я не думаю, что регулярное выражение подходит для этого. (Я не принимаю регулярное выражение, чтобы идентифицировать слова CamelCased с ведущей буквой в верхнем регистре как дубликат, так как вопрос не требует регулярного выражения 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-offer как дубликат?
  • 0
    @mplungjan Я не понимаю, почему. Ответов на нерегулярные выражения нет. И ни один из них не справляется с (не очень) особым случаем, который я изложил.
-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. :П

  • 0
    Он ломается при вводе, как "myPDFFile" . Возвращает [ "my", [ "p" ], [ "D" ], [ "F" ], "File" ]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню