Точка втечі в діапазоні регулярних виразів


76

З якоїсь причини ці два регулярні вирази діють однаково:

"43\\gf..--.65".replace(/[^\d.-]/g, "");​  // 43..--.65
"43\\gf..--.65".replace(/[^\d\.-]/g, "");​  // 43..--.65

Демо

У першому регулярному виразі я не уникаю крапки ( .), тоді як у другому регулярному виразі - ( \.).

Які відмінності і чому вони діють однаково?

Відповіді:


63

Оскільки крапка знаходиться всередині класу символів (квадратні дужки []).

Погляньте на http://www.regular-expressions.info/reference.html , там написано (у розділі класу char):

Будь-який символ, крім ^ -] \, додайте цей символ до можливих збігів класу символів.


7
а мінус ( -) потрібно уникати, лише якщо він знаходиться в середині діапазону?
gdoron підтримує Моніку

3
Якщо ви хочете зіставити дефіс, додайте його відразу після відкриття квадратної дужки, наприклад [-AZ]. В іншому випадку дефіс вказує діапазон. Це працює у вашому випадку, ймовірно, лише тому, що ви не вказуєте діапазон у регулярному виразі, але я б запропонував вам слідувати посиланням, якщо ви додасте діапазон пізніше.
usoban

3
або безпосередньо перед закриваючим кронштейном, або ви можете врятуватися від нього через скісну риску
Code Jockey

101

Точковий оператор .не потрібно екранувати всередині класу символів [].


35

Якщо ви використовуєте JavaScript для тестування свого регулярного виразу, спробуйте \\.замість \..

Він діє так само, оскільки JS видаляє першу зворотну косу риску.


3
Цей мене сьогодні врятував. Я не міг зрозуміти, чому вираз не буде працювати. Дякуємо
Mārtiņš Radiņš

4

На цій веб-сторінці я бачу, що:

"Пам'ятайте, що крапка не є метасимволом всередині класу символів, тому нам не потрібно уникати її за допомогою зворотної риски".

Тому я думаю, що втеча від цього зайва ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.