Точно найти буквы в случайной строке, используя RegEx - PullRequest
3 голосов
/ 24 октября 2019

Упор здесь делается на слово точно . Это должно работать для любого количества перестановок, так что, надеюсь, мой пример достаточно ясен.

Учитывая строку случайных букв, возможно ли (с использованием RegEx) сопоставить точное количество букв в данной строке?

Итак, если у меня есть строка (str1), содержащая буквы ABZBABJDCDAZ, и я хочу сопоставить буквы JDBBAA (str2), моя функция должна вернуть true, поскольку str1 содержитвсе правильные буквы достаточно раз. Однако, если str1 изменить на ABAJDCDA, функция вернет false, поскольку str2 требует, чтобы str1 имел как минимум 2 экземпляров буквы B.

Это то, что я до сих пор использовал в диапазоне:

const findLetters = (str1, str2) => {
  const regex = new RegExp(`[${str2}]`, 'g')
  const result = (str1.match(regex))
  console.log(result)
}

findLetters('ABZBABJDCDAZ', 'JDBBAA')

Как видите, он соответствует правильным буквам, но соответствует всем их экземплярам. Есть ли способ сделать то, что я пытаюсь сделать с помощью RegEx? Причина, по которой я сосредотачиваюсь на RegEx, заключается в том, что мне нужно, чтобы этот код был высоко оптимизирован, и до сих пор другие мои функции, использующие Array.every() и indexOf(), просто слишком медленные.

Примечание: только моя функциятребуется вернуть значение true/false.

Ответы [ 2 ]

5 голосов
/ 24 октября 2019

Попробуйте (здесь мы сортируем буквы обеих строк, а затем создаем регулярное выражение типа A.*A.*B.*B.*D.*J)

const findLetters = (str1, str2) => {
  const regex = new RegExp([...str2].sort().join`.*`)
  return regex.test([...str1].sort().join``)
}

console.log( findLetters('ABZBABJDCDAZ', 'JDBBAA') );
console.log( findLetters('ABAJDCDA', 'JDBBAA') );
2 голосов
/ 24 октября 2019

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

const findLetters2 = (strSearchIn, strSearchFor) => {
  var strSearchInSorted = strSearchIn.split('').sort(function(a, b) {
    return a.localeCompare(b);
  });
  var strSearchForSorted = strSearchFor.split('').sort(function(a, b) {
    return a.localeCompare(b);
  });

  return hasAllChars(strSearchInSorted, strSearchForSorted);
}

const hasAllChars = (searchInCharList, searchCharList) => {
  var counter = 0;
  for (i = 0; i < searchCharList.length; i++) {
    var found = false;
    for (counter; counter < searchInCharList.length;) {
      counter++;
      if (searchCharList[i] == searchInCharList[counter - 1]) {
        found = true;
        break;
      }
    }
    if (found == false) return false;
  }
  return true;
}

// No-Regex solution
console.log('true: ' + findLetters2('abcABC', 'abcABC'));
console.log('true: ' + findLetters2('abcABC', 'acbACB'));
console.log('true: ' + findLetters2('abcABCx', 'acbACB'));
console.log('false: ' + findLetters2('abcABC', 'acbACBx'));
console.log('true: ' + findLetters2('ahfffmbbbertwcAtzrBCasdf', 'acbACB'));
console.log('false: ' + findLetters2('abcABC', 'acbAACB'));

Не стесняйтесь проверять его скорость и оптимизировать его, так как я не эксперт по js. Это решение должно повторять каждую строку один раз после сортировки. Сортировка происходит благодаря https://stackoverflow.com/a/51169/9338645.

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