Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Оптимизация кода regEx (https://javascript.ru/forum/events/61840-optimizaciya-koda-regex.html)

Alexander Belov 11.03.2016 12:21

Оптимизация кода regEx
 
Привет!

Прошу помочь оптимизировать код.

Задание:
есть словосочетание, состоящее из 2-х слов, переданное аргументом в функцию.
Нужно поменять первые буквы в словах этого словосочетания местами.
Например, ввели "New York", должны получить "Yew Nork", "In Utero" -> "Un Itero" и т.д. Словосочетание всегда из 2-х слов.

Написал вот такую функцию:
function exchange( input ) {

var f = input.charAt(0),//первая буква первого слова в словосочетании

   str = input.substr( input.indexOf(" ") + 1 ),//второе слово в словосочетании

   s = str.charAt(0);//первая буква второго слова в словосочетании

   var e = f,//вводим резервную переменную для сохранения значения первой буквы

   f = s, //поменяли буквы местами
   s = e; //поменяли буквы местами

var pre1 = input.replace( input.charAt(0), f ),//заменили первую букву первого слова в словосочетании
    res2 = str.replace( str.charAt(0), s );//заменили первую букву второго слова

var res1 = pre1.substring(0, pre1.indexOf(" "));//"обрезали" второе слово в исходном словосочетании 

var result = res1 + " " + res2;//соединили изменённые слова в новое словосочетание = получили ответ

}

exchange("Dave Grohl")
//result = Gave Drohl


Но есть подозрение, что такая задача решается намного компактнее. Кому не сложно, напишите, пожалуйста, компактный пример решения, используя regEx.

Alexander Belov 11.03.2016 12:46

Кому интересно, есть такой вариант, но хотелось бы именно при помощи regEx.

function exchange (input) {

arr = input.split(" ")

return arr[1].slice(0,1) + arr[0].slice(1) + " " + arr[0].slice(0,1) + arr[1].slice(1)

}

destus 11.03.2016 13:14

function exchange(input) {
            input.replace(/(\b\w)(\w+\b)\s(\b\w)(\w+\b)/g, function (str,p1,p2,p3,p4) {
                alert(p3+p2+' '+p1+p4);
            })
        }
        exchange('Dave Grohl');

Alexander Belov 11.03.2016 13:36

destus,
прокомментируйте, пожалуйста, свой код
input.replace(/ (\b\w)(\w+\b)\s(\b\w)(\w+\b) /g

(\b\w)(\w+\b)\s -
\s - это пробел
(\b\w) - это словесный символ в начале или конце строки?
(\w+\b) - ?

destus 11.03.2016 13:57

Alexander Belov,
function exchange(input) {
            alert(input.replace(/(\b\w)(\w*)\s(\b\w)(\w*)/,'$3$2 $1$4'))
        }
exchange('Dave Grohl');


ищем первый символ (\b\w), все символы до пробела после него (\w*) и заменяем.


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