Раздражающая и странная проблема с регулярным выражением: ‘io .’ get совпадает со словом ‘функция’

#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