Javascript заменить все не работает в сафари на macOS / iOS - PullRequest
0 голосов
/ 21 февраля 2020

Я получил ошибку ниже в сафари на macOS / iOS

Учтите, что мне нужно заменить заполнитель на фактическую цену

const formattedPrice = '$1,100.00';
str.replace( /\|\|TOTAL_REPAYMENT_CHARGES\|\|/g, formattedPrice);

результат выше будет ,100.00

но если я использую ниже единицы, это работает

const formattedPrice = '$1,100.00';
str.replace( '||TOTAL_REPAYMENT_CHARGES||', formattedPrice)

результат будет $1,100.00

Может кто-нибудь объяснить, что произошло? спасибо

1 Ответ

1 голос
/ 21 февраля 2020

Когда первый параметр .replace является регулярным выражением, а второй параметр .replace является строкой, JS будет анализировать второй параметр в соответствии с некоторыми правилами , что позволяет краткая замена с полным совпадением или группой захвата. Например, $& указывает на необходимость замены на полное совпадение:

console.log('foo'.replace(/o/g, 'a$&'));

Выше каждое совпадение заменяется на a, за которым следует полное совпадение, и оба совпадения равны o, поэтому оба совпадения заменяются на ao .

В вашем коде $1 интерпретируется как «заменить эту часть первой группой захвата». Но в вашем коде нет групп захвата, поэтому вместо замены совпадений на '$1,100.00' они заменяются на ',100.00'.

Чтобы указать литерал $, используйте two $ с, вот так:

const formattedPrice = '$$1,100.00';
//                       ^
str.replace( /\|\|TOTAL_REPAYMENT_CHARGES\|\|/g, formattedPrice);
...