|
Модераторы: ginnie |
|
Akella |
|
||||||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
Есть выражение для поиска номеров телефонов:
но в тексте часто встречается не только номер телефона, но и цена, или какой-нибудь номер, например, номер объявления
Вопрос. Как построить выражение, которое будет пропускать такие вот совпадения, если в совпавшем тексте найден нежелательный(е) символ(ы)? |
||||||
|
|||||||
Pfailed |
|
|||
Опытный Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 6 Всего: 39 |
Например так: http://forum.vingrad.ru/index.php?showtopi...t&p=2413918
|
|||
|
||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
не доходит, а можно конкретнее?
|
|||
|
||||
Pfailed |
|
|||
Опытный Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 6 Всего: 39 |
Например здесь мы ищем цифры. Но если перед цифрами знак номера, то такие цифры нам не подходят.
На выходе вторая match группа содержит 1234.
Словами это выражение: ( 1-я альтернатива - найти знак номера, затем возможно пробелы 2-я альтернатива просто разделитель отделяющий цифры ) затем цифры, которые мы ищем просим движок рег выражений не возвращаться на позицию до текущей если поиск потерпит неудачу говорим что поиск неудачен если найдена 1-я альтернатива Таким образом: движок находит "№ 4444444" - 1-я альтернатива получает указание что поиск неудачен - FAIL возвратиться за 4444444 он уже не может - SKIP ищет далее и находит уже 2-ю альтернативу "1234" (действительно тут нет знака номера) 2-я альтернатива - это не первая -> поиск успешен Используя такую технику можно создавать достаточно сложные условия для выражений, которые не должны встречаться. |
|||
|
||||
alezzz |
|
|||
сплю... Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 11 Всего: 14 |
а возле номера телефона есть за что зацепться, например "тел." или код города в скобках?
не в тему, недочитал и непонял суть вопроса. Это сообщение отредактировал(а) alezzz - 25.5.2012, 23:30 |
|||
|
||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
||||
|
||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
а как насчет просмотра вперед или назад
http://ru2.php.net/manual/ru/regexp.reference.assertions.php (?<=bullock|donkey) |
|||
|
||||
Pfailed |
|
|||
Опытный Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 6 Всего: 39 |
Просмотр вперед годится, но просмотр назад в Perl должен быть фиксированой длинны, т.е никаких "*" или "+". Хотя в некоторых других языках, .Net например, такого ограничения нет.
|
|||
|
||||
Akella |
|
||||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
Не понял, что не так.
Вот выражение
Вот текст:
Выражение находит все три группы цифр, в том числе и 68651705, хотя это нужно пропускать Что не так в этом выражении? |
||||
|
|||||
DurRandir |
|
|||
Опытный Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 2 Всего: 17 |
Много почему))
1. Потому что ?! - это look-ahead assertion. А look-behind - это ?<! 2. Заменили, отлично. Но теперь матчинг для выражения №1234567 будет начинаться не с позиции №-->1<--2345, а с позиции №1-->2<--345, т.е. просто пропускает 1ю цифру. Поэтому добавим ещё одно условие - ?<!\d Итого, получается что-то вроде (+я свернул общий хвост у выражений)
Это сообщение отредактировал(а) DurRandir - 21.6.2012, 16:06 |
|||
|
||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
||||
|
||||
DurRandir |
|
|||
Опытный Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 2 Всего: 17 |
Я проверял на приведённой строке. Если какие-то другие данные - покажите. Это сообщение отредактировал(а) DurRandir - 21.6.2012, 18:11 |
|||
|
||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
||||
|
||||
Akella |
|
||||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
Что-то у Вас тут напутано со скобками, как мне кажется Добавлено через 1 минуту и 45 секунд Вот это выражение вообще ничего ненаходит:
Добавлено через 2 минуты и 25 секунд а вот это работает:
Добавлено через 3 минуты и 35 секунд Но всё равно находит: Добавлено через 3 минуты и 47 секунд Может дело в знаке №? Добавлено через 4 минуты и 38 секунд Да, действительно, если изменить в тексте объявления № на # и в выражении, то всё ок |
||||
|
|||||
DurRandir |
|
|||
Опытный Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 2 Всего: 17 |
>Вот это выражение вообще ничего ненаходит
А вы не в перле смотрите, судя по скриншоту. Там концовка - /g - модификатор поиска всех совпадений, и требует стартового слеша / - они играют роль скобок-ограничителей. >всё равно находит Возможно, проблема в юникоде/кодировках? Я потому и проверял на ASCII-строке, чтобы это не влияло. |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |