string.replace не работает в Firefox?

У меня есть ряд динамических действий на моей странице Oracle Apex 4.2 с действием «Выполнить код Javascript» в поле ввода номера телефона:

$s("P40_MOBILE_PHONE", $v("P40_MOBILE_PHONE").replace(/[()-\s]+/g, ''));

Это работает в IE и Chrome. Однако в Firefox это не только не работает, но и приводит к полному прекращению работы всех других динамических действий на странице.

Единственная разница между этим и другими динамическими действиями заключается в использовании string.replace(/[()-\s]+/g, ''). Это должно удалить любые пробелы, символы (, ) и - из номера телефона.


person Jeffrey Kemp    schedule 12.03.2014    source источник
comment
попробуйте \(\) и \- вместо просто () и -   -  person dandavis    schedule 12.03.2014
comment
@dandavis, спасибо, исправил. Если вы поставите это как ответ, я отмечу это правильно.   -  person Jeffrey Kemp    schedule 12.03.2014
comment
я не думаю, что исправление опечатки принесет пользу другим; нет смысла в полном ответе, чтобы загрязнить поиски ...   -  person dandavis    schedule 12.03.2014
comment
Если ты так говоришь. С моей точки зрения, это не была опечатка, я действительно не знал, что вы не можете ссылаться на отдельные символы в регулярном выражении - поскольку это работало в IE и Chrome, я начал с предположения, что это синтаксически правильный. Поиск Google и поиск SO не помогли. Если я упрощу этот вопрос, он может быть полезен для других, не так ли?   -  person Jeffrey Kemp    schedule 12.03.2014
comment
нет ничего плохого в том, чтобы отвечать самому себе. к сожалению, у меня нет времени, чтобы охватить все особенности упорядочения зарезервированных символов в диапазоне символов, поскольку это связано с несоответствиями интерпретации спецификаций браузера, и я чувствую, что мой слишком широкий ответ о том, как избежать всего, работает, но не идеален...   -  person dandavis    schedule 12.03.2014
comment
ну, я все равно ценю вашу очень быструю помощь :)   -  person Jeffrey Kemp    schedule 12.03.2014
comment
Скобки внутри класса символов не должны экранироваться. Как отмечает Ориол, на самом деле проблема заключается в тире.   -  person Stephen P    schedule 12.03.2014


Ответы (2)


Как сказал @dandavis в комментарии, экранирование тире работает (хотя нет необходимости экранировать круглые скобки).

Если вы попытаетесь запустить код

/[()-\s]+/

Вы получаете

SyntaxError: invalid range in character class

Это потому, что Firefox пытается использовать тире в качестве символа диапазона, а не тире.

Чтобы исправить это, вы можете:

  • Избегайте тире: /[()\-\s]+/
  • Поставьте тире в начале или в конце: /[-()\s]+/, /[()\s-]+/
person Oriol    schedule 12.03.2014
comment
спасибо, это тоже сработало; вы объяснили, почему это не сработало; и вы дали мне совет для диагностики подобных проблем в будущем :) - person Jeffrey Kemp; 12.03.2014

Для дальнейшего использования изменение регулярного выражения следующим образом устранило проблему:

replace(/[\(\)\-\s]+/g, '')
person Jeffrey Kemp    schedule 12.03.2014
comment
.. конечно, как мера безопасности лучше, чем сожалеть, но в этом нет необходимости, если вы понимаете классы регулярных выражений char! - person Crayon Violent; 12.03.2014
comment
До этого вопроса я действительно не понимал, что иногда вам нужно экранировать эти символы, а иногда вам не нужно этого делать. Я привык к языкам, которые более последовательны в этом отношении. - person Jeffrey Kemp; 12.03.2014
comment
Что ж, синтаксис регулярных выражений — одна из немногих вещей в мире кодирования, которая почти универсальна. Конечно, у каждого языка могут быть свои особенности и ограничения, но основной синтаксис практически одинаков. Это не несоответствие. Просто классы char позволяют вам указывать диапазон символов с помощью дефиса, например. A-Z. Итак, чтобы отличить это от буквального дефиса, вы должны сделать то, что сказал принятый ответ. Единственными другими символами, которые вам нужно экранировать в классе символов, является [], если вы хотите их использовать, поскольку они являются разделителем класса символов. Который снова, избегая разделителя.. - person Crayon Violent; 12.03.2014
comment
..довольно универсальная вещь. Это единственные вещи, которые должны экранироваться, и опять же, это довольно универсально в мире регулярных выражений. Затем там есть \s, но это для обозначения пробела, а не для создания буквального s. И опять же, escape-символы, такие как \s, \n, \t, довольно универсальны. Я не пытался тебя ругать, так что прошу прощения, если ты так воспринял! - person Crayon Violent; 12.03.2014
comment
Я использую слово непоследовательный не в уничижительном смысле, а в буквальном смысле. Буквально, в регулярном выражении (как я узнал сегодня, ура!), неэкранированный - может означать буквальный символ - или диапазон символов, в зависимости от его контекста. В этом смысле он противоречив, но, конечно, имеет четко определенные правила, с которыми должен ознакомиться любой автор регулярных выражений. - person Jeffrey Kemp; 12.03.2014