Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Ротация символов в строке (https://javascript.ru/forum/events/62373-rotaciya-simvolov-v-stroke.html)

Alexander Belov 07.04.2016 13:38

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

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

"Iowa" VS "oIaw" // true

"Iowa" VS "aIow" // true

"Iowa" VS "stateIowa" // false

"Iowa" VS "Io wa" // false


и т.д.

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

В интернете нашёл похожие вопросы на других языках, при помощи чего сделать такое сравнение с ротацией на JS? RegExp, как я понимаю, не подойдут тут.

рони 07.04.2016 13:52

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"));

Alexander Belov 07.04.2016 22:36

рони,
Благодарю!
А всё же есть способ решить такую задачу при помощи только RegExp?

рони 07.04.2016 23:01

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"));

Alexander Belov 07.04.2016 23:09

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

Для этого сравнения нам нужно как бы вручную прописать нашу строку.
А чтобы вся эта RegEx магия осуществлялась автоматически, читая строку-аргумент, переданный функции? Так можно сделать?

рони 07.04.2016 23:39

Alexander Belov,
напишите цикл для формирования RegEx который выдаст /(?=.*I)(?=.*o)(?=.*w)(?=.*a)/

рони 08.04.2016 00:05

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"));

Alexander Belov 09.04.2016 16:14

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


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

И почему второй аргумент функции - это пустая строка?

рони 09.04.2016 16:21

Alexander Belov,
лучше вам посмотреть документацию, пустая строка это склад для цикла, это то что вернёт функция в конце цикла. "(?=.*I)(?=.*o)(?=.*w)(?=.*a)" -- это результат в пустой строке.

Alexander Belov 09.04.2016 16:49

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


Часовой пояс GMT +3, время: 09:11.