![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
kemiisto |
|
||||||||||||||||||||||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 16 Всего: 160 |
Вторая редакция статьи. Исправлены ошибки, синтаксис регулярных выражений описан в более распространенных терминах. Огромное спасибо source777 за помощь в подготовке статьи!
![]() Последнюю редакцию статьи всегда можно получить по ссылке. Введение Регулярные выражения (regular expressions) — современная технология поиска текстовых фрагментов в электронных документах, соответствующих определенным образцам. Правила (rules) — это новое название регулярных выражений. Именно так они именуются в последней версиии языка Perl, признанного лидера по работе со строками. Образец (pattern), задающий правило поиска, по-русски также иногда называют «шаблоном», «маской». Регулярные выражения произвели прорыв в электронной обработке текста в конце XX века. Сейчас регулярные выражения используются многими текстовыми редакторами и утилитами для поиска и изменения текста на основе выбранных правил. Многие языки программирования уже поддерживают регулярные выражения для работы со строками. На моё удивление, в Delphi не оказалось встроенного модуля/компонента для работы с регулярными выражениями. Это существенное упущение разработчиков Delphi. Однако, как известно, свято место пусто не бывает! Итак, знакомьтесь, TRegExpr — класс для работы с регулярными выражениями в Delphi. Берём с официального сайта архив с модулем и примерами. Составные части регулярных выражений
Любой символ совпадает с самим собой (если только он не относится к метасимволам). Любая последовательность символов совпадает с такой же во входной строке. Чтобы представить метасимволы ., - [ ] и другие в регулярных выражениях без интерпретации, то есть, в качестве простых (не специальных) символов необходимо предварить их обратной косой чертой: \. Этот приём называется защитой метасимволов. Например, чтобы представить сам символ «точка» (просто точка, и ничего более), надо написать \. (обратная косая черта, а за ней - точка). Сам метасимвол \ тоже может быть защищен, то есть представлен как \\ (две обратных косых черты), и тогда интерпретатор регулярных выражений воспримет его как простой символ обратной косой черты \. Также можно использовать escape-последовательности, например:
Символьные классы Символьный класс — просто конечный набор символов. Он ограничивается квадратными скобками и содержит перечисление символов, которые можно вместо него подставить. Заменяется он всего на один символ, входящий в это перечисление. Примеры:
Стандартные символьные классы ![]() Фиксирующие директивы Фиксирующие директивы — это символы, которые привязывают правило к некоторому признаку. Например, к концу или началу строки. Наиболее часто используемые:
Квантификаторы Показывают, сколько раз может повторяться предыдущий символ (символьный класс, альтернатива и т.д.) Ограничиваются парой фигурных скобок. Примеры:
Квантификаторы
Короткие записи популярных квантификаторов ![]() Жадность Речь пойдёт о жадности среди квантификаторов. квантификаторам в регулярных выражениях соответствует максимально длинная строка из возможных (они являются «жадными», greedy). Это может оказаться значительной проблемой. Например, часто ожидают, что выражение <.*> найдёт в тексте теги HTML. Однако этому выражению соответствует целиком строка <p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью</p> Эту проблему можно решить двумя способами. Первый состоит в том, что в регулярном выражении учитываются символы, не соответствующие желаемому образцу ([^>]* для вышеописанного случая). Второй заключается в определении квантификатора как "нежадного" ("ленивого", lazy), добавив после него знак вопроса. Например, выражению <.*?> соответствует не вся показанная выше строка, а отдельные теги (выделены цветом): <p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью</p> "Жадные" варианты квантификаторов пытаются захватить как можно большую часть входного текста, в то время как "не жадные" - как можно меньшую. Например, 'b+' как и 'b*' примененные к входной строке 'abbbbc' найдут 'bbbb', в то время как 'b+?' найдет только 'b', а 'b*?' - вообще - пустую строку; 'b{2,3}?' найдет 'bb', в то время как 'b{2,3}' найдет 'bbb'. Альтернативы Нужны, когда необходимо объединить несколько правил в одно. При этом совпадение засчитывается, когда есть совпадение хотя бы с одним правилом. Желательно альтернативы заключать внутрь группировки (круглые скобки). Правила, входящие в вариант, разделяются | (вертикальной чертой). Примеры:
В данном примере продемонстрирована альтернатива в группировке. В принципе альтернатива может существовать и вне группировки, но так возникает больше ошибок. Группировки Используются, когда необходимо обрабатывать результат частями. Например, при обработке ссылок в HTML-документе удобно отдельно обрабатывать текст ссылки и URL. Группировки заключаются в круглые скобки. Модификаторы Модификаторы предназначены для изменения поведения правила. Назначение и примеры - смотри в справке. Использование в Delphi Рассмотрим несколько примеров использования регулярных выражений в Delphi. Пример использования Использовать регулярные выражения в Delphi просто.
Результат работы программы: ![]() Пример использования вариантов и подвыражений
Регулярное выражение для этого случая будет выглядеть несколько сложнее: (\d+)([.,])(\d+), т.е. содержать соотв. подвыражения (целая и дробная части) и вариант (в качестве разделителя может выступать как точка, так и запятая), который также представляет собой подвыражение. Выражение, соотв. всему регулярному выражению по-прежнему находится в Match[0], а вот Match[i] содержит i-ую группировку. Также обратите своё внимание на достаточно интересную функцию
которая возвращает ATemplate, в котором все '$&' и '$0' заменены на найденное регулярное выражение, а '$n' на n-ое подвыражение. Например, оператор
добавленный в предыдущий пример, вывел бы исходное число. Пример анализа текста Давайте напишем простенький анализатор текста. На это раз сделаем GUI-приложение. На форме расположим один экземпляр TButton, один экземпляр TMemo и пять экземпляров TLabel. ![]() При нажатии на кнопку, реализуем показ диалога выбора текстового файла и загрузку его в Memo1.
Теперь давайте реализуем сбор статистики по мере изменения текста в Memo1:
Во-первых, остановимся на подсчёте количества символов, исключая пробельные. Здесь был использован метод
заменяющий в AInputStr все вхождения регулярного выражения на AreplaceStr. Вычисляя сумму длин полученных таким образом строк, получим искомую величину. Теперь взглянем на подсчёт количества предложений в нашем примере. Ответом на вопрос «Что надо найти?», будет, скорее всего, «Количество точек, знаков восклицания и знаков вопроса, стоящих в конце слова или строки.» Кроме того, следует учитывать возможность наличия неединичных знаков препинания (…, !?). Составляем регулярное выражение '[.!?]+(\s|$)', и собственно всё! Задача решена! При подсчёте количества слов можно, например, использовать регулярное выражение вида '\s*[^\s.-]+-?[^\s.-]*. Слово может следовать за пробелом, а может и нет (если стоит в начале текста). Поэтому вначале нашеговыражения стоит \s*. Собственно слово (написанное без орфографических ошибок) — последовательность непробельных символов. То есть мы могли бы записать регулярное вражение так: '\s*[\S]'. Но под такой шаблон попадут и некоторые другие символы и их последовательности, которые врядли можно назвать словами — многоточие, тире. Чтобы исправить ситуацию мы пишем '\s*[^\s.-]'. Ну и, наконец, необходимо учесть наличие слов, которые пишутся через дефис и получим '\s*[^\s.-]+-?[^\s.-]*. Важно понимать, что основное преимущество при использовании регулярных выражений заключается в экономии времени! Вам необходимо лишь задаться вопросом «Что надо найти?» и составить регулярное выражение, которое является ответом на этот вопрос, а не разрабатывать «с нуля» алгоритм поиска. Успехов! ![]() Архив с примерами Статья в PDF P.S. Для тестирования регулярных выражений можнов воспользоваться инструментом RegExp Studio, взять который можно тут. Это сообщение отредактировал(а) kemiisto - 7.2.2009, 20:37 -------------------- |
||||||||||||||||||||||||
|
|||||||||||||||||||||||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
а если многоточие? ) ничего так статья, для начинающих самое то! кстати, к самим RegExpr идет очень подробный и познавательный хелп на русском. многие ньансы там освещены. Это сообщение отредактировал(а) MetalFan - 25.5.2008, 11:01 -------------------- There are always someone smarter than you... |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 16 Всего: 160 |
MetalFan, согласен! Просто первое, что пришло на ум было '\.|\?|!' Спасибо! Рад стараться! ![]() -------------------- |
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
kemiisto, хорошая статья, спасибо, начну изучать. Все понятно и хорошо написано
![]() |
|||
|
||||
lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
Да регулярные выражение это крутая вещь... где я их только не использую... а на счет скорости работы функций из этого модуля... Все из них при обращении создают новый объект TRegExpr и исбавляются от него в конце, что и замедляет выполнение функции при большом кол-во использований...
-------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
На этой странице проблемы с кодировкой, пробовал в 3х браузерах... скорее вот из за этого...
-------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
IE7 при установке в ручную "Кириллица (Windows)" нормально отображает
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Лучше уж заменить эту конструкцию на '[.!?](\s|$)', так будет намного точнее... Добавлено через 3 минуты и 42 секунды Вообще, я мельком только статью просмотрел, но даже при этом бросилось в глаза непонимание автором оператора | , очень во многих местах он используется абсолютно не к месту... -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
Foux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 27.5.2008 Репутация: нет Всего: нет |
Здесь рассмотрены примеры поиска конкретных символов,
но как получить символы находящиеся между определенных символов, например содержимое HTML тэга? |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
'<a\s+href=(.*?)\s.*?>(.*?)</a>' В итоге ссылка будет в RegExp.Match[1], а текст ссылки в RegExp.Match[2]. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
kemiisto |
|
||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 16 Всего: 160 |
source777, спасибо за feedback! Но, буду защищаться!
Хм... За прошедшее время пролистал несколько книг по регулярным выражениям. Вот что, к примеру, пишет Джеффри Фридл
Я и не путаю. Мне пришло в голову записать '\.|\?|!', Вам - '[.!?]'. Это фактически одно и тоже. Где же тут, простите, "непонимание"? Да и, вообще, "к месту/ не к месту" определяет, по-моему, автор.
Да, лучше. Но я же чётко написал: Добавлено через 2 минуты и 55 секунд Народ, а кто тег " Регульрные" добавил? Исправить можно? -------------------- |
||||
|
|||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Тихо, тихо. Во-первых, это только логически одно и то же, да и то далеко невсегда. Например, '\w+|[а-яА-Я]+' совсем не то же самое, что '[\wа-яА-Я]+', вот тебе и непонимание, а говорил, что не путаешь... А во-вторых, это дополнение твоей заметки, а не перечёркивание её целиком, имхо, с твоей стороны вместо того, чтобы гордиться тем, что тебе пришло на ум по крайней мере, стоило бы внести изменения на более правильные варианты. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
Matematik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 17 Всего: 50 |
Еще есть TPerlRegEx http://www.regular-expressions.info/delphi.html
В тяжелых случаях работает быстрее чем TRegExpr |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Matematik,
|
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 16 Всего: 160 |
Akella, имелось ввиду PCRE-based Components for Delphi for Windows/Win32 (чуть ниже, того что ты привёл). Будет время посмотрю как там работа организована.
-------------------- |
|||
|
||||
WaReZMEN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
Статья супер все простые варианты я понял и активно заюзал но столкнулся со сложным вариантом помогите разобраться пожалуйста
вот текст ABC := 'dsfdfdsf' Хочу получить только слово ABC ABC.ABC := 'dsfdfdsf' Ничего не получу потому как есть "." ABC :Integer; ничего не берем ну естественно пробелы до ABC куча может быть и после тоже... а также под ABC понимается некоторое слово на латинице.... |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 16 Всего: 160 |
WaReZMEN, может я что не так понял в постановке задачи, но не вижу ничего сложного. Регулярное выражение ([a-zA-Z]+) :=, нужное слово будет в RegExp.Match[1].
А может всё-таки не только слово, нои любой идентификатор? Уточните задачу. -------------------- |
|||
|
||||
WaReZMEN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
там может быть не только латинское слово также и цифры и прочая лабуда но интересует чтоб не было точки (SDF.ABC) и после не ABC должно быть :=
P.S. если строчка будет вида ABC := 'fdsfdsf'; FGHJ.DFR1 :='dfdgdfg'; то все равно берем ABC если б во второй части (FGHJ.DFR1 :='dfdgdfg') не было точки, а было бы DFR1 :='dfdgdfg' мы бы еще получили и DFR1. Это сообщение отредактировал(а) WaReZMEN - 13.1.2009, 20:00 |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
тогда уж, \b([a-zA-Z]+)\s*:= т.к. Кроме того, можно долго спорить о том, как может выглядеть слово на латинице, оно отнюдь не ограничено одними буквами, в случае идентификаторов всё проще, они однозначно детерминируются синтаксисом конкретного языка программирования. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
WaReZMEN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
язык паскаль мне нужно из кода выделить только переменые проблема в том что они в var не объявлены а просто в коде попадаются типа как в байсике де хачу там пишу... И равно не нужно выносить...
Добавлено через 9 минут и 19 секунд source777, если как ты говориш то при такой ABC := 'fdsfdsf'; FGHJ.DFR :='dfdgdfg'; строке получится и ABC и DFR а далжно получится только ABC потому что у DFR в начале стоит точка. Чуть не забыл если точка не слитно со словом то оно считается без точки (FGHJ. DFR :='dfdgdfg' мы получим DFR). Это сообщение отредактировал(а) WaReZMEN - 13.1.2009, 20:08 |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
(\s|^)([a-zA-Z]+)\s*:=, нужное слово будет в RegExp.Match[2].
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
WaReZMEN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
О спасибо!!! а можно расшифровать и пояснить почему RegExp.Match[2]?
|
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Да, на здоровье.
RegExp.Match[2] потому, что нужное тебе слово находится внутри второй пары круглых скобок в регулярке. А расшифровка примерно такая: (пробельный символ или начало строки)(один или более символов из набора латинских букв) любое_число_пробельных_символов := -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
WaReZMEN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
Снова к вам
![]() На этот раз хочу получить значение между скобками [ ] делаю так \[(.*)\] в результате получаю все но мне нужно те значения из скобок которые содержат a-zA-Z а также _ " . делаю так \[([a-zA-Z0-9_"\.]+)\] подскажите где ошибка? P.S. точек и "_" может быть от 1-~ а вот кавычки " только 2 Добавлено через 7 минут и 38 секунд Вот строка для теста Итого: [round([SUMM]*100)/100] [OrdGridsDM.IBtblOrders."ORD_CURRENCY"][txt] должно получится [OrdGridsDM.IBtblOrders."ORD_CURRENCY"] |
|||
|
||||
source777 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Давай-ка ты будешь яснее объяснять что нужно...
А именно: 1) пример текста 2) твоё регулярное выражение 3) найденные им совпадения 4) совпадения, которые регэксп должен был бы найти Пример: 1)
2) \[([a-zA-Z0-9_".]+)\] 3) [Java] [_".NET"] 4) [Java] [_".NET"] Добавлено через 2 минуты и 18 секунд
Почему? Должно получится: [SUMM] [OrdGridsDM.IBtblOrders."ORD_CURRENCY"] [txt] либо ты плохо объяснил, что тебе нужно... Добавлено через 6 минут и 37 секунд Вообще по описанию похоже, что ищется такое выражение: \[([\w.]*("[\w.]+")?[\w.]*)\] -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
||||
|
|||||
WaReZMEN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
Вы правы я не совсем точно сказал...
в строке обязательно будут a-zA-Z " . а вот 0-9 и _ не обязательно но могут. |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Тогда так: \[([\w.]*"[\w.]+"[\w.]*)\]
Эта регулярка найдёт выражение в квадратных скобках, если оно содержит две и только две двойных кавычки, внутри и снаружи которых могут быть латинские буквы, цифры, точки и знаки подчёркивания, кроме того внутри двойных кавычек должен быть хотя бы 1 символ... P.S. Не отклоняйся от предложенного формата описания того, что нужно, поверь, он нагляднее любых слов. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
WaReZMEN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
||||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Это общий совет на будущее, когда спрашиваешь про регулярные выражения, описывай проблему в формате 1) пример текста 2) твоё регулярное выражение 3) найденные им совпадения 4) совпадения, которые регэксп должен был бы найти так тебя быстрее поймут, да и ответить правильно будет проще, т.к. появляется чёткий и однозначный критерий правильности: п.3 совпадает с п.4. ![]()
![]() P.S. ты ещё рекурсивных регэкспов не встречал, вот там реальная жесть ![]() -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
WaReZMEN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
source777, спасибо! а про он-лайн не знал буду знать я просто клевый редактор нашел ну не совсем такой как хотелось бы, но давольнотаки хороший...
|
|||
|
||||
WaReZMEN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
Здрасти снова я
![]() есть строка 'Итого: [round([SUMM]*100)/100] [OrdGridsDM.IBtblOrders."ORD_CURRENCY"]'#$D#$A'[txt]'#$D#$A сеичас делаю так \[\w.*?\] получаю [round([SUMM] [OrdGridsDM.IBtblOrders."ORD_CURRENCY"] [txt] хочу получать [round([SUMM]*100)/100] [OrdGridsDM.IBtblOrders."ORD_CURRENCY"] [txt] Тоесть скажем так что если у нас открылось две [[ то результат нужно брать с второй ] скобки если их будет 3 то с трете... зарание спасибо!!!! Это сообщение отредактировал(а) WaReZMEN - 17.4.2009, 11:46 |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Читай про рекурсивные шаблоны для регулярных выражений.
P.S. Я не в курсе есть ли их поддержка для Delphi. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
WaReZMEN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
source777, спасибо за совет...
|
|||
|
||||
m6a6g6 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.8.2009 Где: Волгоград Репутация: нет Всего: нет |
Так как сайт Андрея Сорокина уже не работает, то дам ссылки на аналогичные библиотеки.
Проект PCRE. Он совместим с последними (Unicode) версиями Delphi, не требует сторонних библиотек и перейти на него с TRegExpr не так уж и сложно. Удачи Вам. |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
chip_and_dayl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 603 Регистрация: 22.4.2007 Где: Украина, Киев Репутация: 1 Всего: 9 |
А есть свойство, которое отключает проверку по регистру!?!
-------------------- Фсё будет хорошо!!! |
|||
|
||||
chip_and_dayl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 603 Регистрация: 22.4.2007 Где: Украина, Киев Репутация: 1 Всего: 9 |
Уже нашел
-------------------- Фсё будет хорошо!!! |
|||
|
||||
Plavozont |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 182 Регистрация: 14.4.2008 Репутация: нет Всего: нет |
PCRE - Perl Compatible Regular Expressions
http://www.pcre.org/ Оригинальная система регулярных выражений родившаяся в языке Perl, самая "прямая" на сегодняшний день, просто добавь pcre3.dll ! Добавлено через 3 минуты и 8 секунд ... ой тут же 3 страницы форума... не заметил... Это сообщение отредактировал(а) Plavozont - 10.12.2010, 00:46 --------------------
Fortunately, the circumstances under which those words are useful run out at a relatively low level of multiplicity. |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Кто нибудь знает, как заставить PrelRegEx (что уже встроены в D XE) понимать кирилицу в качестве букв для шаблонов типа \w?
-------------------- There are always someone smarter than you... |
|||
|
||||
vicerm |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 22.12.2008 Репутация: нет Всего: нет |
Здравствуйте.
Как можно подружить границу слова \b с русскими буквами? \b(а|в|у)(\s) не ищет вообще ничего. Без \b работает, только находит и там где не надо. \b(a|as|the|and)(\s) работает правильно. В общем нужно выражение для вставки неразрывного пробела после предлога. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |