замена новой строки javascript - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть регулярное выражение для замены значения color из заданной строки, оно хорошо работает, когда нет новой строки, как показано ниже ...

 var BodyContent = "background-color:red;color:white";

  // NOTE : there is no new line constant  

 var dis = BodyContent.replace(/(^|;)color:\s*([^;]+)/, "$1color:" + 'green'); 

 //returns dis ="background-color:red;color:green"; //Works well

Но не работает, когда это так

BodyContent = "background-color:red; \n color:white;"; // Note the newline constant

var dis = BodyContent.replace(/(^|;)color:\s*([^;]+)/, "$1color:" + 'green');

//returns dis = "background-color:red;color:white"; there is no change.the color is still white

Это мое регулярное выражение для замены значения цвета /(^|;)color:\s*([^;]+)/.

Теперь, как я могу сделать с этой новой линией также?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 23 ноября 2011

У вас две проблемы. Во-первых, вам нужно установить многострочный флаг в вашем регулярном выражении, если вы хотите, чтобы ^ соответствовало после новой строки в середине строки поиска. Во-вторых, вы вставляете "\n" (с пробелами) во второй BodyContent. Ваше регулярное выражение не обрабатывает пробелы после новой строки.

Попробуйте это:

/((?:^|;)\s*)color:\s*([^;]+)/m
1 голос
/ 23 ноября 2011

Вы должны использовать пробел после точки с запятой (или начала строки), но перед "color". Вы также должны использовать пробел перед двоеточием:

/(^|;|\n|\s+)color\s*:\s*([^;]+)/

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

/(^|;|\n|\s+)color\s*:\s*([^;}]+)/
1 голос
/ 23 ноября 2011

Решение

var dis = BodyContent.replace(/(^|[;\n\s]+)color:\s*([^;]+)/, "$1color:" + 'green');

Пояснения

Ваше регулярное выражение /(^|;)color:\s*([^;]+)/ соответствует цвету, который является либо началом строки (^), либо префиксом с ;.Сбой в следующих случаях:

"background-color:red; \n color:white;";

'color' - это префиксы через пробел (\ s).В некоторых случаях перед ним может стоять префикс новой строки (\ n);

"background-color:red; \ncolor:white;";

Поэтому для сопоставления в этих случаях используется регулярное выражение (^|[;\n\s]+)color:\s*([^;]+).Соответствует строке 'color' в четырех случаях:

  • В начале строки: "color:white;"
  • с префиксом ;: "background-color:red;color:white;"
  • с префиксом одной или несколькими новыми строками: "\ncolor:white;"
  • с префиксом одним или несколькими пробелами: " color:white;"
0 голосов
/ 23 ноября 2011

Попробуйте:

var dis = BodyContent.replace(/([\s;{]color:)\s*[^\s;}]+/, "$1green"); 

Если вы не обрабатываете текст по одной строке за раз, нет необходимости специально обрабатывать перевод строки.Это просто еще один символ пробела, и вам нужно соответствовать любому из них;для этого \s.Нет необходимости совпадать с началом строки, поэтому вам не нужен якорь ^.

Однако вам следует разрешить открывающую скобку, если «color:» является первым объявлениемв правиле.Например:

H1{color:white;background-color:red;}

Кроме того, с учетом этого действительного правила:

H1{background-color:red;color:white }

... ваше регулярное выражение будет соответствовать ;color:white } и заменить его на ;color:green, что приведет к неверному CSS,Вот почему я изменил второй класс символов с [^;] на [^\s;}].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...