2013-11-12 3 views
0

Я хочу переместить некоторый пользовательский тест ввода с Java на javascript. Код предполагает удаление подстановочных знаков из строки ввода пользователя в любой позиции. Я пытаюсь преобразовать следующие Java нотацию JavaScript, но постоянно получаю ошибкуJava replaceAll для javascript regex

"Invalid regular expression: /(?<!\")~[\\d\\.]*|\\?|\\*/: Invalid group". 

я почти не имею опыта работы с регулярными выражениями выражений. Любая помощь будет высоко ценится: JAVA:

str = str.replaceAll("(?<!\")~[\\d\\.]*|\\?|\\*",""); 

Мой провал версия JavaScript:

input = input.replace(/(?<!\")~[\\d\\.]*|\\?|\\*/g, '');  
+3

В Javascript нет следов. – anubhava

+0

Может ли кто-нибудь подтвердить, что в JS \ d также нужно писать как \\ d как в Java? – Pshemo

+0

@Pshemo Нет необходимости бежать \ as \\ при написании литерала regexp, как указано выше. – some

ответ

0

Проблема, как анубхава указывает, что JavaScript не поддерживает утверждения 'назад. Печально, но верно. Утверждение lookbehind в вашем исходном регулярном выражении - (?<!\"). В частности, он ищет только строки, которые не начинаются с двойной кавычки.

Однако все не потеряно. Есть несколько трюков, которые вы можете использовать для достижения того же результата, что и lookbehind. В этом случае lookbehind существует только для того, чтобы предотвратить замену символа до тильды. Мы можем сделать это в JavaScript, сопоставляя характер в любом случае, но включая его в замене:

input = input.replace(/([^"])~[\d.]*|\?|\*/g, '$1'); 

Заметим, что для чередованием \? и \*, не будет ни одной группы, так $1 будет вычисляться в пустую строку , поэтому не стоит включать его в замену.

ПРИМЕЧАНИЕ: это не эквивалентно 100% оригинальному регулярному выражению. В частности, поисковые утверждения (например, lookbehind выше) также препятствуют потреблению входного потока, что иногда может быть очень полезно при сопоставлении вещей, которые находятся рядом друг с другом. Однако в этом случае я не могу думать о том, что это будет проблемой. Сделать вполне эквивалентное регулярное выражение было бы более сложным, но я считаю, что это отвечает требованиям исходного регулярного выражения.

+0

Это потрясающе! Я не знал, с чего начать. Этот матч достаточно близко для меня, и я определенно его использую. Большое спасибо! – user2917629

+0

Рад, что это помогло! Удачи! –

Смежные вопросы