#javascript #regex #node.js #escaping
#javascript #регулярное выражение #node.js #экранирование
Вопрос:
Из node REPL вещь,
> 'function'.search('io.')
5
Мне действительно нужно, чтобы оно соответствовало только «io». а не «function» или чему-либо еще с просто «io» посередине…
Еще больше странных вещей:
> 'io'.search('io.')
-1
> 'ion'.search('io.')
0
Похоже, я не экранирую символ точки ..? Но я согласен с «»… верно? Я тестировал это на обоих http://www.regextester.com / и http://regexpal.com / и это работает так, как я думаю, это должно работать.
Что я делаю не так? Является ли регулярное выражение материалом в node.js несколько отличается от того, к чему я привык?
EDIT1: В консоли javascript Google Chrome я также получаю
'function'.search('io.')
5
Так что это может быть проблема с v8… верно?
ПРАВКА2: Я получаю те же результаты из консоли javascript Firefox, так что это не относится к версии 8… Что здесь происходит? Я действительно в замешательстве…
Комментарии:
1. Когда я использую косую черту спереди, не экранирую ли я следующий символ? Я хотел сопоставить букву ‘i’, за которой следует буква ‘o’, за которой следует точка, а не какой-либо символ. В regexpal и на этом другом сайте он работает с ‘io .’…
2. @Oded: он включил обратную косую черту перед ., которая обычно избегает метасимволов. Очевидно, таково было его намерение. Не уверен, почему ты этого не видишь…
Ответ №1:
Ваше регулярное выражение правильное, но вы также должны закодировать его для помещения в строку. Итак, ваше (правильное) регулярное выражение выглядит следующим образом:
io.
Однако обратная косая черта также является escape-символом строки. Чтобы создать строку, содержащую это регулярное выражение, вам нужно избежать обратной косой черты:
'io\.'
То, как вы это написали, на самом деле содержит строку io.
, которая правильно соответствует function
.
Комментарии:
1. Стоит упомянуть, что в JavaScript
/io./
также работает для определения регулярных выражений без необходимости иметь дело с двойным экранированием `
Ответ №2:
Проблема здесь в том, что обратная косая черта используется как escape-символ на двух уровнях: в строковых литералах и в регулярных выражениях. Например, '\'
это строка, содержащая единственную обратную косую черту (которую вы можете увидеть, если введете ее в REPL).
Есть два варианта:
-
экранирование обратной косой черты:
'\.'
это строка, содержащая обратную косую черту и точку, которая является регулярным выражением, совпадающим с точкой. -
используйте литерал регулярных выражений:
/io./
> 'function'.search(/./) -1