Ротация символов в строке
Привет!
Пытаюсь написать функцию, которая сравнивает исходную строку с произвольными строками из массива. Например, у нас есть строка "Iowa": "Iowa" VS "oIaw" // true "Iowa" VS "aIow" // true "Iowa" VS "stateIowa" // false "Iowa" VS "Io wa" // false и т.д. Была идея разбить строку посимвольно и сравнить со второй строкой на наличие, но тогда, к примеру, "Iowa" VS "abcdewio" вернёт true. Т.е., нужно сравнить так, чтобы ещё эти символы стояли в произвольном порядке, но все рядом. В интернете нашёл похожие вопросы на других языках, при помощи чего сделать такое сравнение с ротацией на JS? RegExp, как я понимаю, не подойдут тут. |
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")); |
рони,
Благодарю! А всё же есть способ решить такую задачу при помощи только RegExp? |
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")); |
рони,
Круто! Не могу ставить плюсы Вам уже пока. Для этого сравнения нам нужно как бы вручную прописать нашу строку. А чтобы вся эта RegEx магия осуществлялась автоматически, читая строку-аргумент, переданный функции? Так можно сделать? |
Alexander Belov,
напишите цикл для формирования RegEx который выдаст /(?=.*I)(?=.*o)(?=.*w)(?=.*a)/ |
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")); |
рони,
прокомментируйте, пожалуйста, работу reduce в данном коде. Вот эту часть: "(?=.*" + b + ")" Каждый символ строки а складывается с любым символом (=?=.*) и с аргументом b? И почему второй аргумент функции - это пустая строка? |
Alexander Belov,
лучше вам посмотреть документацию, пустая строка это склад для цикла, это то что вернёт функция в конце цикла. "(?=.*I)(?=.*o)(?=.*w)(?=.*a)" -- это результат в пустой строке. |
рони,
Благодарю! Как раз читаю про неё, но не всё сразу понятно. |
Часовой пояс GMT +3, время: 09:11. |