Регулярное выражение Самое длинное возможное соответствие - PullRequest
8 голосов
/ 31 марта 2010

У меня есть строка ввода, которая является адресом каталога:

Пример: ProgramFiles/Micro/Telephone

И я хочу очень строго сопоставить ее со списком слов:

Пример: Tel|Tele|Telephone

Я хочу сопоставить с Telephone, а не Tel.Прямо сейчас мое регулярное выражение выглядит так:

my( $output ) = ( $input =~ m/($list)/o );

Выражение выше будет соответствовать Tel.Что я могу сделать, чтобы это исправить?

Ответы [ 3 ]

9 голосов
/ 31 марта 2010

Если вы хотите, чтобы все слова соответствовали:

\b(Tel|Tele|Telephone)\b

\b - граница слова нулевой ширины. Граница слова в данном случае означает переход от или к символу слова. Символ слова (\w) [0-9a-zA-Z_].

Если вы просто хотите найти совпадение с самым длинным в совпадении с частичным словом, поставьте самое длинное на первое. Например:

\b(Telephone|Tele|Tel)

или

(Telephone|Tele|Tel)
2 голосов
/ 31 марта 2010

Измените заказы: Tel|Tele|Telephone на Telephone|Tele|Tel. По алгоритму регулярных выражений чередование ищется слева направо, если найдено совпадение, то это не жадное сопоставление. Например: / a | ab | abc / для «abc» соответствует «a» вместо самого жадного «abc».

или используйте соответствующие выражения.

Tel(?:e(?:phone)?)?
0 голосов
/ 07 февраля 2011

Как насчет попытки найти совпадение, если самое длинное совпадение отсутствует нигде на входе?Что-то вроде:

Найти телефон, ИЛИ найти телефон и телефон, где телефон не находится нигде на входе.Итак, чтобы начать выглядеть как регулярное выражение:

(телефон) ИЛИ символы без телефона, затем (tel | tele), а затем символы без телефона

(телефон |. * (Телефон) {0}. * (Тел | теле). * (Телефон) {0}. *)

Имеет ли это какой-либо смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...