Как заставить IE заменить регулярное выражение буквенной строкой «$ 0»

#javascript #regex #replace

#javascript #регулярное выражение #заменить

Вопрос:

Я заменяю кучу значений в регулярном выражении на суммы в долларах. Проблема в том, что в IE, если я пытаюсь заменить на количество $0 (или, теоретически, $1 $9 ), замена никогда не происходит, поскольку она пытается заменить несуществующую группу:

 'foo'.replace(/f/g, '$0');
  

Я хочу, чтобы результатом этой замены было «$ 0oo», как в Chrome и FF, но не в IE9 (не пробовал другие версии IE).

У Chrome и FF есть «проблема» со следующим, в том, что я не могу понять, как заменить литералом $1 :

 'foo'.replace(/(f)/g, '$1')
  

Ответ №1:

Напишите, "$$0" чтобы избежать $ знака.

Ответ №2:

В Chrome и Firefox вы можете обойти это ограничение, используя функцию в качестве второго аргумента функции replace:

 'foo'.replace(/(f)/g, function(){return '$1';}); // => $1oo
  

Мое собственное тестирование показывает, что IE8 согласуется с другими браузерами в этой проблеме.

Комментарии:

1. спасибо 🙂 Я соглашусь немного позже, но предпочел бы решение, которое каким-то образом избегает $ , в отличие от накладных расходов на вызов функции

2. Как мы думаем, сколько это накладных расходов?

Ответ №3:

Проблема:

 'My Bank balance is {0} '.replace(/{0}/,'$0.22')
 results: "My Bank balance is {0}.22 " 
 This is not what we want
  

Решение:

 'My Bank balance is {0} '.replace(/{0}/,'$$0.22')
results: "My Bank balance is $0.22 " 
'My Bank balance is {0} '.replace(/{0}/,"$0.22".replace(/$/,'$$$$'))
result: "My Bank balance is $0.22 "
  

Объяснение: Я пытаюсь найти ‘$’ и заменить на ‘$$’. Чтобы сопоставить ‘$’, вы должны экранировать его с помощью ‘ $’, а для замены ‘$$$$’ вы должны поместить четыре ‘$’ в качестве экранирования регулярного выражения ‘$’ вместо ‘$ $’. Весело!!

Ответ №4:

@SLaks это должно быть больше похоже на: напишите «$$» вместо буквального «$».

@cwolves получение литерала вместо «специального» символа (например, «$» здесь) обычно включает либо его удвоение, либо добавление к нему префикса «».

Комментарии:

1. обычный escape-знак «» не работал, и ничто другое в JS не экранируется путем его удвоения, поэтому мне это никогда не приходило в голову 🙂