| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Регулярные выражение |
| Автор: Akella 19.5.2008, 09:18 |
Есть текст, в котором встречаются наборы цифр в разных форматах, вот наиболее часто используемые:
243-12-3 1999-05-14 1234567 1-234567 12 34 567 1 500 000 1-(123)-456-78-90 755 58 69 ------- 15000 1 500 000 у.е. 1 500 000 уе Есть выражение: (\d[\d? -\-]{7,}) довести до ума не получается. Какие условия? По идее выражение должно видеть только номера телефонов, как видно из списка, то две последние строки (с у.е. и уе) не есть номерами телефонов, вот из списка должно попасть в результаты всё, кроме последних строчек после ------- Буду признателен за помощь |
| Автор: Akella 19.5.2008, 09:51 | ||
| вот ещё подсказали: (\d[\d\(\)\- ]*\d)
но проблема в том, что наборы типа 777 или 123 или 1254 тоже попадают, т.е. нужно ещё контролировать количество цифр, т.е. найти все наборы, где цифр, например от 7 до 11 |
| Автор: dumb 19.5.2008, 10:23 | ||
|
| Автор: Akella 19.5.2008, 10:30 | ||
вот ,например текст объявления:
пока что самым нормальным шаблоном является этот: (\d[\d- ]{5,}) |
| Автор: dumb 19.5.2008, 10:35 |
| хех, этот пример разительно отличается от того, что ты привел в первом посте. для составления регэкспа нужно как можно больше "случаев" текста. твой регэксп совсем не имеет условия окончания. |
| Автор: Akella 19.5.2008, 10:40 | ||
dumb,
http://regexpr.ru |
| Автор: dumb 19.5.2008, 10:51 | ||
без признаков начала-конца строки и whitespace'ов:
ты лучше чуть больше примеров текста выложи. |
| Автор: kemiisto 19.5.2008, 12:24 |
| Akella, дайте лучше точное описание, что считается в этой задачке телефонным номером. Тогда запросто напишете выражение. Решать задачу фактически без формулировки... Да и ещё, должен (по-моему) быть какой-то чёткий стандарт на телефонные номера: разделитель - либо пробел, либо тире; скобки - либо разрешены, либо нет. Тогда будет проше разобрать документ. Или документ уже имеется и там такая котовасия? |
| Автор: Akella 19.5.2008, 12:47 | ||
Вот то, что прога сканирует, цветом выделены номера телефонов, которые должны попасть в совпадения
Добавлено @ 12:49 так вот нужно составить несколько выражений с описанием, чтобы пользователь перед старом мог выбрать, т.к. в разных городах, да что там в городах, в разных организациях по разному пишут телефоны, где с тире, где только цифры, где тире со скобками, где пробел Добавлено @ 12:54 Автор к сожалению не даёт возможности использовать пре и пост условия http://regexpstudio.com/RU/ |
| Автор: Akella 19.5.2008, 13:05 |
| как видно, запятая является разделителем телефонов, если их несколько, может быть и точка с запятой Добавлено через 45 секунд Само собой, что идеального шаблона выражения не составишь, хотелось бы поиметь несколько более или менее нормальных Добавлено через 1 минуту и 49 секунд Как видно из примера, в качестве разделителя цифр в телефоне может быть пробел, скобки, тире, а может быть вообще без разделителей Добавлено через 2 минуты и 36 секунд Плохо, что в дельфи нет встроенных регулярок, как это в MSVS сделано, при чём там сделано, как мне сказали "по-уму". |
| Автор: dumb 19.5.2008, 14:14 | ||
эм... может как-нибудь так?
|
| Автор: Akella 19.5.2008, 14:22 |
| нет, это слишком сложное: Внимание регулярное выражение содержит ошибки: preg_match_all(): Unknown modifier '(' |
| Автор: dumb 19.5.2008, 14:40 |
| ты это.. когда проверяешь на regexpr.ru, обрамляй регулярку в слэши-то: /(блабла)(блаблабла)/ Добавлено через 3 минуты и 14 секунд и кстати: применимо к регуляркам выражение "слишком сложное" практически не употребимо... |
| Автор: kemiisto 19.5.2008, 17:31 | ||
Akella, можеть быть Вас устроит поиск всей строки телефонов, а не каждого в отдельности? Если да, то можно так:
Проект приаттачил. Вроде как работает. За исключением очевидных ошибок/опечаток (см. например, вторую строку т. , 80978247435). Такие опечатки не имеет смысла обрабатывать, т.к их может быть бесконечно много. |
| Автор: Akella 19.5.2008, 22:26 |
| kemiisto, я такие взрослые выражения и сам потом не разрулю, если пользователям нужно будет что-либо подкорректировать Добавлено через 1 минуту и 54 секунды мало того, проверил на regexpr.ru -> совпадений не найдено |
| Автор: kemiisto 19.5.2008, 23:38 | ||
Akella, где ты видел пользователей, даже чисто теоретически способных корректировать регулярные выражения? Не показатель! Мало ли! У меня в проекте Delphi всё сработало. Скачай лучше http://www.regexpstudio.com/Downloads/TestRExp.rar от автора TRegExpr и пользуй для проверки регулярных выражений. Там кстати моё выражение тоже катит (что не удивительно). Проблема всё-таки с определением образца. Уж очень много альтернатив. Просто число - не катит; число, а потом какой-либо разделитель и опять число - опять не катит! Скобки ещё всякие, у.е. У меня складывается ощущение, что задача вообще не решаема. Даже вручную, словесно, сложно сформулировать правило поиска именно телефонных номеров в приведённом куске текста. |
| Автор: Akella 21.5.2008, 22:11 | ||
я имел ввиду, что пользователю захочется немного подкорректировать условие поиска телефонов, но корректировать-то буду я тем более описания нет вот ответ с выражением и описанием http://forum.vingrad.ru/index.php?showtopic=212006&view=findpost&p=1516904 Добавлено через 1 минуту и 31 секунду вот им и пользуюсь, немного подкорректировал и пользуюсь, просто других библиотек нет для дельфи Добавлено через 5 минут и 9 секунд я не спорю, что она полностью решаема, просто хотелось бы поиметь несколько более менее подходящих выражений. Добавлено через 7 минут и 16 секунд а про исключения не в курсе? можно ли в выражении задавать исключения, допустим не брать во внимание наборы цифр, где много нулей подряд, например 150000 или 1 500 000 Добавлено через 9 минут и 37 секунд как видно из текста, чаще всего (практически постоянно) попадаются номера, где разделитель пробел, тире или скобки, или без разделителей, ну так обычно телефоны и пишут, вот на таких условиях что можно придумать ещё? |
| Автор: dumb 22.5.2008, 02:29 |
| Akella, ты видел http://forum.vingrad.ru/index.php?showtopic=212006&view=findpost&p=1517349? - на твоем примере текста работает четко. |
| Автор: Akella 22.5.2008, 08:24 |
| а как описать это выражение? |
| Автор: dumb 23.5.2008, 14:32 | ||
э.. словами?..
ищем последовательность, которая начинается и заканчивается цифрой, а между ними от 4 до 15 цифр,пробелов,тире или скобок. после должны быть либо разделители(.,;\n\r), либо пробел, за которым не следует символ $ или русская 'у'. |
| Автор: Akella 23.5.2008, 15:38 |
т.е. можно задавать исключения? круто, опробуем-с |
| Автор: kemiisto 24.5.2008, 11:43 | ||
Естественно! Перечни символов (символьные классы) — просто конечный набор символов. Он ограничивается квадратными скобками и содержит перечисление символов, которые можно вместо него подставить. Заменяется он всего на один символ, входящий в это перечисление. Если первый символ перечня (идущий сразу после открывающейся квардратной скобки) — ^, то это означает символ, который отсутствует в данном перечислении. Пример,
Пролистай прикреплённый документ (он пока ещё не дописан), авось пригодится! Заодно оцени! |
| Автор: Akella 26.5.2008, 11:33 |
| Спасибо, прочёл, дописывай. Будет полезным. |
| Автор: THandle 26.5.2008, 11:40 |
Не знаю что там было в предыдущем посте kemiisto прикреплено, не качается, но вот его же статья по регуляркам: http://forum.vingrad.ru/articles/topic-213075.html |
| Автор: Akella 26.5.2008, 12:55 |
| я скачал и прочёл |
| Автор: Akella 26.5.2008, 15:57 | ||||||||||
Вот выражение
По идее мну нужно выудить числовое значение в скобках, допустим
или
или
или
правильно ли составлено выражение? Я так понимаю, что или цифры, или выражение в скобках, так? Добавлено @ 15:57 а мне нужны цифры в скобках |
| Автор: Akella 26.5.2008, 16:29 | ||
воде вот оно:
|
| Автор: dumb 26.5.2008, 17:10 | ||
можно проще:
к тому же у тебя в subexpr попадает только "дробная" часть, а все выражение вместе со скобками. приведенная рега поместит в subexpr все число. Добавлено через 3 минуты и 25 секунд только оно не очень строгое - в том плане, что и (...) будет удовлетворять условию. |
| Автор: Akella 29.5.2008, 10:05 |
| http://www.sweethome.in.ua/regexp/regexp.aspx здесь ещё можно проверять(тестировать) регулярки |