Проблема с Javascript RegExp-маской - PullRequest
1 голос
/ 02 апреля 2010

У меня есть строка, которая выглядит примерно так:

{theField} > YEAR (today, -3) || {theField}  < YEAR (today, +3)

Я хочу заменить его на:

{theField} > " + YEAR (today, -3) + " || {theField}  < " + YEAR (today, +3) + "

Я пробовал это:

String.replace(/(.*)(YEAR|MONTH|WEEK|DAY+)(.*[)]+)/g, "$1 \" + $2 $3 + \"")

Но это дает мне:

{theField} > YEAR (today, +3) || {theField}  >  " + YEAR  (today, +3) + "

У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 02 апреля 2010

Вы должны быть осторожны, используя жадное сопоставление, когда у вас есть .*. Обычно это не делает то, что вы хотите - это соответствует как можно большей части строки. Вам нужно либо использовать класс отрицательных символов, чтобы остановить сопоставление при достижении определенного символа (например, [^)]), либо использовать lazy match .*?. Вот как это можно сделать с помощью ленивого квантификатора:

s = '{theField} > YEAR (today, -3) || {theField}  < YEAR (today, +3)';
result = s.replace(/((YEAR|MONTH|WEEK|DAY).*?\))/g, '" + $1 + "')

Результат:

{theField} > " + YEAR (today, -3) + " || {theField}  < " + YEAR (today, +3) + "

Обратите внимание, что я немного вычистил ваше регулярное выражение:

  • Удалено + из DAY+, как заметил Кенни ТМ
  • Изменено [)]+ на \)
  • Изменена литеральная строка замены с двойных кавычек, чтобы исключить кавычки в тексте замены
  • Убрано лишнее пространство, которое вы помещаете в результат между ГОДОМ и следующей открывающей скобкой
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...