Раздражающая и странная проблема с регулярным выражением: 'io \.' получить совпадение по слову «функция» - PullRequest
4 голосов
/ 21 мая 2011

Из узла REPL вещь,

> 'function'.search('io\.')
5

Мне действительно нужно, чтобы оно совпадало только с "io". а не "функция" или что-то еще, просто "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 ... верно?

EDIT2: я получаю те же результаты от javascript-консоли Firefox, так что это не v8 ... Что здесь происходит? Я действительно смущен ...

Ответы [ 2 ]

8 голосов
/ 21 мая 2011

Ваше регулярное выражение верно, но вы также должны закодировать его для помещения в строку.Итак, ваше (правильное) регулярное выражение выглядит следующим образом:

io\.

Однако, обратная косая черта также является escape-символом строки.Чтобы создать строку, содержащую это регулярное выражение, вы должны экранировать обратную косую черту:

'io\\.'

Как вы написали, строка на самом деле содержит io., что правильно соответствует function.

6 голосов
/ 21 мая 2011

Проблема здесь в том, что обратный слеш используется как escape-символ на двух уровнях: в строковых литералах и в регулярных выражениях. Например, '\\' - это строка, содержащая обратную косую черту * (которую можно увидеть, если ввести ее в REPL).

Есть два варианта:

  • экранировать обратную косую черту: '\\.' - это строка, содержащая обратную косую черту и точку, которая является регулярным выражением, совпадающим с точкой.

  • используйте регулярное выражение: /io\./

    > 'function'.search(/\./)
    -1
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...