Ротация символов в строке
Привет!
Пытаюсь написать функцию, которая сравнивает исходную строку с произвольными строками из массива. Например, у нас есть строка "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, время: 23:03. |