Как с помощью регулярного выражения проверить есть ли перед символом определённый символ

Рейтинг: 1Ответов: 1Опубликовано: 29.04.2015

Есть номер телефона +7 123 456-78-90.

Нужно модифицировать регулярное выражение /([0-9])/ для javascript таким образом, чтобы семерка после плюса не попала в результат обработки.

Ответы

▲ 4Принят

Вообще (но не в JavaScript, об этом ниже!), проверить, есть ли какая-то последовательность символов перед выражением вы можете с помощью zero length look-behind positive/negative assertion:

Для positive:

(?<=foo)

И для negative:

(?<!foo)

В вашем случае это negative (не попала) и + вместо foo, если я правильно понимаю:

(?<![+])

Смысл данной конструкции в том, что вы проверяете, есть ли что-то/нет ли чего-то перед выражением, но это что-то не попадает внутрь самого выражения, а только является доволнительным условием (отсюда zero length).

Квадратные скобки вокруг + стоят, потому что + сам по себе является специальным символом и обрабатывается особенно. Чтобы забрать у него его магичность, нужно его экранировать или превратить в символьный класс, что я и сделал.

Подробнее о zero length assertions вы можете прочитать здесь:

Как же обстоят дела в JavaScript?

Проблема в том, что JavaScript на данный момент не поддерживает пока что look-behind assertions, поэтому приходится его имитировать разными способами.

Способ 1. Простейший и наиболее популярный:

newString = string.replace(/([abcdefg])?m/, function($0,$1){ return $1?$0:'m';});

Здесь не выполняется никакой замены, это просто демонстрация, как сделать look behind assertion в JavaScript.

Способ 2. Другой — использовать look ahead assertion, но перед этим перевернуть строку и выражение! Здесь помогает то, что look ahead assertion JavaScript'ом поддерживается.

К перевёрнутой строке применяем:

[0-9](?![+])

Обратите внимание на то, что [0-9] здесь стоит сначала, перед [+], и применяем мы это выражение тоже к перевернутой строке.

Подробнее: