2015-06-29 4 views
1

Я только что закончил this programming challenge on CodeWars:Regex для переменных индексов от слова границы

написать функцию toWeirdCase, которая принимает строку и возвращает ту же строку со всеми даже индексированными символами в каждом слове верхнего обсаженных и все нечетные индексированные символы в каждом слове, расположенном ниже. Только что объясняемая индексация основана на нулевом значении, поэтому нулевой индекс четный, поэтому этот символ должен быть верхним.

Я попытался выяснить это с помощью регулярного выражения, прежде чем сдаваться и просто использовать цикл for с индексами. Чтобы подтвердить, индекс заглавных букв сбрасывается до 0, когда есть пробел. Итак, ThIs Is A CoRrEcT AnSwEr, но ThIs iS nOt, потому что каждая первая буква каждого слова должна быть заглавной.

Имея это в виду, существует ли подход к поиску альтернативных (нечетных или четных) индексов с использованием регулярных выражений? В этом случае найдите границу слова, используя \b, а затем каждый четный индекс оттуда, до конца слова?

ответ

1

Вы можете взять map для преобразования применить функцию к каждому символу, i%2, чтобы обнаружить, если i нечетное, и toLowerCase или toUpperCase для изменения регистра:

function toWeirdCase(str) { 
    return [].map.call(str, function(char, i) { 
    return char[i%2 ? 'toLowerCase' : 'toUpperCase'](); 
    }).join(''); 
} 

Есть несколько способов, чтобы сбросить индекс в каждом пространстве. Например,

function toWeirdCase(str) { 
    var i = 0; 
    return [].map.call(str, function(char) { 
    if(char === ' ') i = -1; 
    return char[i++ % 2 ? 'toLowerCase' : 'toUpperCase'](); 
    }).join(''); 
} 
+0

Это не соответствует спецификации, которая соответствует индексу относительно слова ** **. –

+0

@torazaburo Вы меня напугали, я понял, вы имеете в виду, что это не соответствует спецификации ECMAScript. – Oriol

0

Вы должны разделить вход в слова, то странно случай каждое слово:

function toWeirdCase(str) { 
    return str.split(' ').map(weirdCaseWord).join(' '); 
} 

weirdCaseWord можно записать как в другой ответ:

function weirdCaseWord(str) { 
    return str.split('').map(function(char, i) { 
    return char[i%2 ? 'toLowerCase' : 'toUpperCase'](); 
    }).join(''); 
} 

Если вы можете использовать одну карту с флагом, который переключается на каждый символ, и сбрасывать на пробел:

function toWeirdCase(str) { 
    var even = false; 
    return str.split('').map(function(char) { 
    even = char === ' ' ? false : !even; 
    return char[even ? 'toUpperCase' : 'toLowerCase'](); 
    }).join(''); 
} 
1

Параметр функции для замены получает смещение смещения после согласованной строки и согласованных групп.

function toWeirdCase(s) { 
    return s.replace(/[a-zA-Z]/g, function (ltr, offset) { 
    return offset & 1 ? ltr.toLowerCase() : ltr.toUpperCase(); 
    }); 
} 
Смежные вопросы