13

Можно-ли используя регулярные выражения сделать так, чтобы включить все буквы: [a-z], но исключить некоторые, например [^ite]. То есть в итоге должно получиться что-то вроде: [a-z] & [^ite].

Сейчас приходит в голову два раза проверять символ на соответствие, сначала одному regex, потом другому.

Deleted
  • 371
phpusr
  • 133
  • 2
    Например, написать явно допустимые интервалы
    [a-df-hj-su-z]
    
    – avp Apr 30 '14 at 09:39

2 Answers2

12
/(?(?=[a-z])[^ite]|^$)/

Схема:

(?(?=regex)then|else)

Пояснение:

Если [a-z], то [^ite] (выбрать из [a-z] все, кроме i, t и e), иначе ^$ (пустая строка)

В случае выполнения условия выборка будет проводится из того массива совпадений, по которому была проверка. В данном случае она будет ограничена латинскими буквами.

Вот тут можно посмотреть пример работы.
А вот тут можно почитать подробнее об использовании условий в регулярных выражениях.

VenZell
  • 19,872
  • Спасибо за подробный ответ. Видимо конструкция если-то не везде поддерживается, здесь (http://www.regexr.com/) не получилось, на Scala тоже, но вот такой вариант: (?=[a-z])[^ite] http://regex101.com/r/tX3lP5/ делает что мне нужно – phpusr Apr 30 '14 at 07:51
  • @phpusr, проблема в том, что вы не указали, на каком языке программирования вам надо это реализовать. В зависимости от этого меняется способ реализации. В моем ответе используется PCRE синтаксис. – VenZell Apr 30 '14 at 08:01
  • хотел добавить что чаще всего используется либа pcre.c в других языках, но не всегда включает расширенный набор возможностей к которому относиться конструкция (?(?=regex)then|else). Иногда нужно включать в самой обвертке. И else не есть обязательным тоесть можно просто (?(?=regex)then) так что городить |^$ это уже перебор – duhon Jan 22 '15 at 00:33
  • Большинство современных программеров эту запись никогда не поймут... Неужто в МГУ не могут придумать ничего проще... Ужос) – user_MGU Jun 29 '22 at 04:29
8

Если первый массив символов соответствует символьному метосимволу, например [a-z] == \pL то можно сделать просто так

[^\PLite]

На практике часто хотят все символы \w минус набор исключений [^ite] то есть [^\Wite]

P.S. это решение на порядок быстрей отработает нежели lookahead. Обрати внимание что я в примере использую \w и \W, тоесть [^\Wa] это отрациние от отрицательного массива \W, значит найти все возможные символы из диапазно b-z (a-z минус a). А быстро это работает потому что работает "математика множест" [a-z] - [a] = [b-z]

duhon
  • 1,155