Проблема, как анубхава указывает, что JavaScript не поддерживает утверждения 'назад. Печально, но верно. Утверждение lookbehind в вашем исходном регулярном выражении - (?<!\")
. В частности, он ищет только строки, которые не начинаются с двойной кавычки.
Однако все не потеряно. Есть несколько трюков, которые вы можете использовать для достижения того же результата, что и lookbehind. В этом случае lookbehind существует только для того, чтобы предотвратить замену символа до тильды. Мы можем сделать это в JavaScript, сопоставляя характер в любом случае, но включая его в замене:
input = input.replace(/([^"])~[\d.]*|\?|\*/g, '$1');
Заметим, что для чередованием \?
и \*
, не будет ни одной группы, так $1
будет вычисляться в пустую строку , поэтому не стоит включать его в замену.
ПРИМЕЧАНИЕ: это не эквивалентно 100% оригинальному регулярному выражению. В частности, поисковые утверждения (например, lookbehind выше) также препятствуют потреблению входного потока, что иногда может быть очень полезно при сопоставлении вещей, которые находятся рядом друг с другом. Однако в этом случае я не могу думать о том, что это будет проблемой. Сделать вполне эквивалентное регулярное выражение было бы более сложным, но я считаю, что это отвечает требованиям исходного регулярного выражения.
В Javascript нет следов. – anubhava
Может ли кто-нибудь подтвердить, что в JS \ d также нужно писать как \\ d как в Java? – Pshemo
@Pshemo Нет необходимости бежать \ as \\ при написании литерала regexp, как указано выше. – some