Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.04.2016, 13:38
Аватар для Alexander Belov
Профессор
Отправить личное сообщение для Alexander Belov Посмотреть профиль Найти все сообщения от Alexander Belov
 
Регистрация: 12.03.2015
Сообщений: 173

Ротация символов в строке
Привет!

Пытаюсь написать функцию, которая сравнивает исходную строку с произвольными строками из массива. Например, у нас есть строка "Iowa":

"Iowa" VS "oIaw" // true

"Iowa" VS "aIow" // true

"Iowa" VS "stateIowa" // false

"Iowa" VS "Io wa" // false


и т.д.

Была идея разбить строку посимвольно и сравнить со второй строкой на наличие, но тогда, к примеру, "Iowa" VS "abcdewio" вернёт true.
Т.е., нужно сравнить так, чтобы ещё эти символы стояли в произвольном порядке, но все рядом.

В интернете нашёл похожие вопросы на других языках, при помощи чего сделать такое сравнение с ротацией на JS? RegExp, как я понимаю, не подойдут тут.
Ответить с цитированием
  #2 (permalink)  
Старый 07.04.2016, 13:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Alexander Belov,
function x(a,b)
       {
         return a.split("").sort().join("") == b.split("").sort().join("")
       }
       alert(x("Iowa","oIaw"));
       alert(x("Iowa","aIow"));
       alert(x("Iowa","stateIowa"));
       alert(x("Iowa","Io wa"));
Ответить с цитированием
  #3 (permalink)  
Старый 07.04.2016, 22:36
Аватар для Alexander Belov
Профессор
Отправить личное сообщение для Alexander Belov Посмотреть профиль Найти все сообщения от Alexander Belov
 
Регистрация: 12.03.2015
Сообщений: 173

рони,
Благодарю!
А всё же есть способ решить такую задачу при помощи только RegExp?
Ответить с цитированием
  #4 (permalink)  
Старый 07.04.2016, 23:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Alexander Belov,


function x(a,b)
       {
         return a.length == b.length && /(?=.*I)(?=.*o)(?=.*w)(?=.*a)/.test(b)
       };
       alert(x("Iowa","oIaw"));
       alert(x("Iowa","aIow"));
       alert(x("Iowa","stateIowa"));
       alert(x("Iowa","Io wa"));
Ответить с цитированием
  #5 (permalink)  
Старый 07.04.2016, 23:09
Аватар для Alexander Belov
Профессор
Отправить личное сообщение для Alexander Belov Посмотреть профиль Найти все сообщения от Alexander Belov
 
Регистрация: 12.03.2015
Сообщений: 173

рони,
Круто! Не могу ставить плюсы Вам уже пока.

Для этого сравнения нам нужно как бы вручную прописать нашу строку.
А чтобы вся эта RegEx магия осуществлялась автоматически, читая строку-аргумент, переданный функции? Так можно сделать?
Ответить с цитированием
  #6 (permalink)  
Старый 07.04.2016, 23:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Alexander Belov,
напишите цикл для формирования RegEx который выдаст /(?=.*I)(?=.*o)(?=.*w)(?=.*a)/
Ответить с цитированием
  #7 (permalink)  
Старый 08.04.2016, 00:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Alexander Belov,
function x(a, b) {
    return a.length == b.length && (new RegExp(a.split("").reduce(function(a, b) {
        return a + "(?=.*" + b + ")"
    }, ""))).test(b)
};
       alert(x("Iowa","oIaw"));
       alert(x("Iowa","aIow"));
       alert(x("Iowa","stateIowa"));
       alert(x("Iowa","Io wa"));
Ответить с цитированием
  #8 (permalink)  
Старый 09.04.2016, 16:14
Аватар для Alexander Belov
Профессор
Отправить личное сообщение для Alexander Belov Посмотреть профиль Найти все сообщения от Alexander Belov
 
Регистрация: 12.03.2015
Сообщений: 173

рони,
прокомментируйте, пожалуйста, работу reduce в данном коде.
Вот эту часть:
"(?=.*" + b + ")"


Каждый символ строки а складывается с любым символом (=?=.*) и с аргументом b?

И почему второй аргумент функции - это пустая строка?
Ответить с цитированием
  #9 (permalink)  
Старый 09.04.2016, 16:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Alexander Belov,
лучше вам посмотреть документацию, пустая строка это склад для цикла, это то что вернёт функция в конце цикла. "(?=.*I)(?=.*o)(?=.*w)(?=.*a)" -- это результат в пустой строке.
Ответить с цитированием
  #10 (permalink)  
Старый 09.04.2016, 16:49
Аватар для Alexander Belov
Профессор
Отправить личное сообщение для Alexander Belov Посмотреть профиль Найти все сообщения от Alexander Belov
 
Регистрация: 12.03.2015
Сообщений: 173

рони,
Благодарю! Как раз читаю про неё, но не всё сразу понятно.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена символов в строке jquery, javascript Derty01 Общие вопросы Javascript 7 12.04.2018 20:38
Количество символов в строке. allanmiln Events/DOM/Window 10 14.11.2014 09:18
вопрос по замене символов в конкретной строке BoSO Элементы интерфейса 18 23.11.2011 23:16
нужно вычислить число символов в строке, не считая пробелов. maxonya Общие вопросы Javascript 2 28.05.2011 14:28
Редактор TinyMCE не отправляет много русских символов cobria2 Общие вопросы Javascript 0 09.05.2011 00:46