Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Регулярное выражение не находит все нужные символы


Автор: begin 9.1.2014, 17:38
Есть функция транслитерации, которая должна заменять:
1. русские буквы на их английский аналог
2. пробел на тире
3. все остальные знаки препинания и математические - на пустой символ

Функция выглядит так:
Код

function translite(str){
var arr={'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ж':'g', 'з':'z', 'и':'i', 'й':'y', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o', 'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'ы':'i', 'э':'e', 'А':'A', 'Б':'B', 'В':'V', 'Г':'G', 'Д':'D', 'Е':'E', 'Ж':'G', 'З':'Z', 'И':'I', 'Й':'Y', 'К':'K', 'Л':'L', 'М':'M', 'Н':'N', 'О':'O', 'П':'P', 'Р':'R', 'С':'S', 'Т':'T', 'У':'U', 'Ф':'F', 'Ы':'I', 'Э':'E', 'ё':'yo', 'х':'h', 'ц':'ts', 'ч':'ch', 'ш':'sh', 'щ':'shch', 'ъ':'', 'ь':'', 'ю':'yu', 'я':'ya', 'Ё':'YO', 'Х':'H', 'Ц':'TS', 'Ч':'CH', 'Ш':'SH', 'Щ':'SHCH', 'Ъ':'', 'Ь':'', 'Ю':'YU', 'Я':'YA', ' ':'-', '"':'', '“':'', '”':'', '«':'', '»':'', "'":'', '.':'', ',':'', ':':'', '+':'', '№':'', '#':'', '!':'', '$':'', '%':'', '&':'', '?':'', '(':'', ')':''};
var replacer=function(a){return arr[a]||a};
return str.replace(/[А-яёЁьЬъЪ\D\s]/g,replacer);
}


Но не могу найти ошибку - не заменяются: мягкий знак, твердый знак и все знаки препинания и математические  smile 
Подскажите, как исправить регулярное выражение?

Добавлено через 4 минуты и 15 секунд
обрезалась строка в функции. вот полный вид:

Код

function translite(str){
var arr={'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ж':'g', 'з':'z', 'и':'i', 'й':'y', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o', 'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'ы':'i', 'э':'e', 
'А':'A', 'Б':'B', 'В':'V', 'Г':'G', 'Д':'D', 'Е':'E', 'Ж':'G', 'З':'Z', 'И':'I', 'Й':'Y', 'К':'K', 'Л':'L', 'М':'M', 'Н':'N', 'О':'O', 'П':'P', 'Р':'R', 'С':'S', 'Т':'T', 'У':'U', 'Ф':'F', 'Ы':'I', 'Э':'E', 
'ё':'yo', 'х':'h', 'ц':'ts', 'ч':'ch', 'ш':'sh', 'щ':'shch', 'ъ':'', 'ь':'', 'ю':'yu', 'я':'ya', 'Ё':'YO', 'Х':'H', 'Ц':'TS', 'Ч':'CH', 'Ш':'SH', 'Щ':'SHCH', 'Ъ':'', 'Ь':'', 'Ю':'YU', 'Я':'YA', 
' ':'-', '"':'', '“':'', '”':'', '«':'', '»':'', "'":'', '.':'', ',':'', ':':'', '+':'', '№':'', '#':'', '!':'', '$':'', '%':'', '&':'', '?':'', '(':'', ')':''};
var replacer=function(a){return arr[a]||a};
return str.replace(/[А-яёЁьЬъЪ\D\s]/g,replacer);
}

Автор: ksnk 9.1.2014, 19:47
Дык. Как работает оператор || для случая, если первый операнд - пустая строка?

Поправить можно, например, так.
Код

var replacer=function(a){return a in arr?arr[a]:a};

Автор: paperstreet7 9.1.2014, 20:56
Оформляйте код как код, чтобы он не выходил за рамки. И зачем изобретать велосипед, когда все давно придумано:
Код

//Если с английского на русский, то передаём вторым параметром true.
transliterate = (
    function() {
        var
            rus = "щ   ш  ч  ц  ю  я  ё  ж  ъ  ы  э  а б в г д е з и й к л м н о п р с т у ф х ь".split(/ +/g),
            eng = "shh sh ch cz yu ya yo zh `` y' e` a b v g d e z i j k l m n o p r s t u f x `".split(/ +/g)
        ;
        return function(text, engToRus) {
            var x;
            for(x = 0; x < rus.length; x++) {
                text = text.split(engToRus ? eng[x] : rus[x]).join(engToRus ? rus[x] : eng[x]);
                text = text.split(engToRus ? eng[x].toUpperCase() : rus[x].toUpperCase()).join(engToRus ? rus[x].toUpperCase() : eng[x].toUpperCase());    
            }
            return text;
        }
    }
)();
var txt = "Съешь ещё этих мягких французских булок, да выпей же чаю!";
alert(transliterate(txt));
alert(transliterate(transliterate(txt), true));


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Регулярное-выражение-не-находит-все-нужные-символы-id52ceb487ae2015b9588b4567#findElement_E7045_52cee2c2ae2015582d563770_0

Автор: ksnk 9.1.2014, 21:10
paperstreet7, Этот велосипед надо еще допилить, чтобы он выкидывал некоторые символы, как в с, исходном.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)