Как разбить строку без пробелов на массив слов? - PullRequest
0 голосов
/ 30 января 2019

Итак, я практикую javascript на freecodecamp.org, создав алгоритм проверки телефона.Мне удалось проверить это, когда только предоставленный номер телефона является строкой чисел.Теперь я застрял и не знаю, как это проверить, если в указанном номере телефона есть такие слова, как «Sixnineone».Поэтому я хочу разделить его на «шесть девять один» или преобразовать их в «691» с массивом числовых объектов.

Вот проблема:

(https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator)

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

вот что я сделал:

    function telephoneCheck(str) {
    let phoneNum = str.toLowerCase().replace(/[^1-9a-z]/g, "");
    let numbers = [
        {0: "o"},
        {1: "one"},
        {2: "two"},
        {3: "tree"},
        {4: "four"},
        {5: "five"},
        {6: "six"},
        {7: "seven"},
        {8: "eight"},
        {9: "nine"}
    ];

    if (phoneNum.match(/[1-9]/)) {
        phoneNum = phoneNum.split('')

        if (phoneNum.length === 10) {
            phoneNum.unshift(1);
        }

        for (let i = 0; i < phoneNum.length; i++) {
            phoneNum[i] = Number(phoneNum[i]);
        }

        if (phoneNum.length === 11 && phoneNum[0] === 1) {
            return true;
        } else {
            return false;
        }

    }

    if (phoneNum.match(/[a-z]/)) {
        console.log(phoneNum);
    }
}

console.log(telephoneCheck("sixone"));

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

1 Ответ

0 голосов
/ 31 января 2019

Одним из способов может быть использование Карта и использование имен в качестве ключа и значения в качестве числа.

Затем извлеките ключи из карты, расположите их так, чтобысамая длинная строка стоит первой и создайте регулярное выражение с группой захвата и чередованием

Регулярное выражение в конечном итоге будет выглядеть так:

(three|seven|eight|four|five|nine|one|two|six|o)

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

В конце получите значение из карты, используя ключ.

let map = new Map([
  ["o", 0],
  ["one", 1],
  ["two", 2],
  ["three", 3],
  ["four", 4],
  ["five", 5],
  ["six", 6],
  ["seven", 7],
  ["eight", 8],
  ["nine", 9]
]);
let regex = new RegExp("(" + [...map.keys()]
  .sort((a, b) => b.length - a.length)
  .join('|') + ")");

let strings = [
  "69ooooneotwonine",
  "o",
  "testninetest",
  "10001",
  "7xxxxxxx6fivetimesfifefofourt",
  "test"

].map(s =>
  s.split(regex)
  .map(x => !map.has(x) ? x.replace(/\D+/, '') : x)
  .filter(Boolean)
  .map(x => map.has(x) ? map.get(x) : x)
  .join(''));

console.log(strings);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...