Javascript.RU

Множественная замена при помощи регулярных выражений (Regexp)

Понадобилось тут, вот выкладываю свое решение)
Исходные данные: Строка с датой вида "13 Aug"

Задача: каждый раз при появлении такой строки заменять английское название месяца на русское типа "13 авг"

Одно из возможных решений:

var str='янвJan февFeb марMar апрApr майMay июнJun июлJul авгAug сенSep октOct нояNov декDec';
p=p.replace(/[a-zA-Z]+/,str.match('[а-яА-Я]+(?='+p.match(/[a-zA-Z]+/)+')'));

Не знаю на сколько это будет быстрее проверок с if-ами, учитывая в этом случае нужно будет 3-4 ифа в среднем

Если нужна расшифровка:
в переменной p строкой "13 Aug" мы заменяем все английские буквы (которые находит регулярное выражение [a-zA-Z]+)

на то, что найдет в строке str регулярное выражение [а-яА-Я]+(?=мес), которое из строки выбирает все русские буквы, если перед ними стоит английское название месяца,

которое мы опять выбираем из переменной p

Можно несколько оптимизировать код:

var str='янвJan февFeb марMar апрApr майMay июнJun июлJul авгAug сенSep октOct нояNov декDec';
mnth=p[0].match(/[a-zA-Z]+/);
p=p.replace(mnth,str.match('[а-яА-Я]+(?='+mnth+')'));
+2

Автор: ixth, дата: 23 августа, 2010 - 10:07
#permalink
var tab = {
	'Jan': 'янв',
	'Feb': 'фев',
	'Mar': 'мар',
	'Apr': 'апр',
	'May': 'май',
	'Jun': 'июн',
	'Jul': 'июл',
	'Aug': 'авг',
	'Sep': 'сен',
	'Oct': 'окт',
	'Nov': 'ноя',
	'Dec': 'дек'
};

p.replace(/\b\w{3}\b/i, function (m) { return tab[m]; });

Три прохода регулярки - это гораздо больше if-ов, чем ты думаешь, %username%!
К тому же, как твоя регулярка отреагирует на строку "Augustene"?


Автор: RE_, дата: 23 августа, 2010 - 10:14
#permalink

ну, теперь два)
действительно, забыл про то что на самом деле все - массивы


Автор: Kolyaj, дата: 25 августа, 2010 - 09:58
#permalink

На самом деле далеко не всё массивы. А только массивы это массивы.


Автор: RE_, дата: 27 августа, 2010 - 11:26
#permalink

А все объекты это не массивы?


Автор: javs, дата: 24 августа, 2010 - 21:58
#permalink

На самом деле, для решения поставленной задачи достаточно одного регулярного выражения:

dm="8 Jul";
mn=['янв','фев','мар','апр','май','июн','июл','авг','сен','окт','ноя','дек'];
d=new Date(Date.parse(dm+(new Date().getYear()+1900))).getMonth();
alert(dm.replace(/[^\d]/g,'')+' '+mn[d]);

Автор: Яростный Меч, дата: 26 августа, 2010 - 09:35
#permalink

Имхо, вариант с картой (как у ixth) оптимальнее.
Сам делал подобное для перевода строки в html и обратно

String.__htrx = /&| |<|>|\r\n|\n|"|"/g;
String.__htrx2 = /&amp;|&nbsp;|&lt;|&gt;|<(br|BR)\s?\/?>|&quot;/g;
String.__htrx.compile(String.__htrx);
String.__htrx2.compile(String.__htrx2);
String.__htMap = { '&': '&amp;', ' ': '&nbsp;', '<': '&lt;', '>': '&gt;', '\n': '<br />', '\r\n': '<br />', '"':'&quot;' };
String.__htMap2 = { '&amp;':'&', '&nbsp;':' ', '&lt;':'<', '&gt;':'>', '<br />':'\n', '<br/>':'\n', '<br>':'\n', '&quot;':'"' };
String.__htFN = function(s) { return String.__htMap[s]; };
String.__htFN2 = function(s) { return String.__htMap2[s.toLowerCase()]; };

String.prototype.HTML = function() { return this.replace(String.__htrx, String.__htFN); };
String.prototype.fromHTML = function() { return this.replace(String.__htrx2, String.__htFN2); };


document.getElementById('id1').innerHTML = '12<>rr\n&6    7'.HTML();
alert(document.getElementById('id1').innerHTML.fromHTML());

Все необходимые объекты созданы заранее, чтоб потом не создавались каждый раз.

ps: варианты с innerText/textContent/doc.createTextNode не сохраняют переводы строки и в нек. случаях несколько пробелов.


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 00:01
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 13:38
#permalink

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
9 + 5 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
Больше записей нет. Прокомментируйте эту запись - может быть, тогда он что-нибудь еще хорошее напишет ;)
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum