Строка Javascript заменяет странность - $$$$ свернут до $$ - в чем причина этого результата? - PullRequest
2 голосов
/ 26 августа 2011

На работе я столкнулся с проблемой, когда пользователи нашего приложения получали сообщения с недопустимым символом Unicode (0xffff), которые в соответствии со стандартом никогда не должны отображаться на символ.

Какбыстрое окончание работы Я сделал следующее:

badStr.replace(/\uffff/g, " ");

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

Однако, пока я игралпри этом я случайно попытался заменить строку «$$$$», которая каким-то образом оказалась свернутой «$$».

Вы можете убедиться сами.Попробуйте вставить следующие строки в строке URL браузера:

javascript: alert(String.fromCharCode(0xffff).replace(/\uffff/g, "@@@@"));

приводит к @@@@

, но

javascript: alert(String.fromCharCode(0xffff).replace(/\uffff/g, "$$$$"));

приводит к $$

На самом деле, похоже, это проблема с любой заменой строки, с $$$$ в качестве замены строки.

Оба:

javascript: alert(String.fromCharCode(0x1234).replace(/\u1234/g, "$$$$"));
javascript: alert("hella".replace("h", "$$$$")); 

приводят к краху $$.

Есть идеи, почему замена строк ведет себя так?

Ответы [ 3 ]

7 голосов
/ 26 августа 2011

Это потому, что $ в строке замены имеет особое значение (расширение группы).Посмотрите на этот пример:

alert("foo".replace(/(.*)/, "a$1b"));

Именно поэтому $$ интерпретируется как $, для случая, когда вам необходимо заменить что-то на $1 (буквально, без расширения группы):

alert("foo".replace(/(.*)/, "a$$1b"));

См. Также https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter.

2 голосов
/ 27 августа 2011

Знак $ - это специальный символ в аргументе замены, обозначающий подстроки в скобках в шаблоне регулярных выражений ($1, $2 и т. Д.).Таким образом, чтобы получить $, вам нужно «сбежать», набрав $$.Что ты и сделал дважды.

1 голос
/ 26 августа 2011

$ в строке замены используется, чтобы сигнализировать об использовании групп совпадений $ 1, $ 2 и т. Д., Si, чтобы поместить $ в строку замены, вам нужно использовать две из них.

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