Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > TRegEx


Автор: Валерия 24.11.2010, 17:57
Использую TRegEx на C++ Buillder XE

Код

TRegEx *reg2;


С поиском разобралась - всё работает:
Код

if (reg2->IsMatch("abc", "b")){
...



С заменой разобралась - всё так-же работает:
Код

reg2->Replace("abcde", "a", "z");


Но вот теперь хочу научиться находить нужное мне по шаблону.
Т.е например есть текст "a1c" и мне нужно по шаблону "a(.*?)с" выделить то, что стоит между "a" и "b" т.е в данном случае это "1"
Делаю так:
Код

TMatch col1 = reg2->Match("a1c", "a(.*)с");
Memo1->Text = col1.Value;

Но в ответ вместо "1" пишет "a1c".
Что я делаю не так?

Автор: Alexeis 24.11.2010, 18:44
Цитата(Валерия @  24.11.2010,  18:57 Найти цитируемый пост)
Но в ответ вместо "1" пишет "a1c".
Что я делаю не так?

  Потому что так задан шаблон. Если бы строка была типа "уйцкйц__a1c_ыуацйуа", то ответ был бы уже "a1c", а не вся строка. Раз определили, что символы a и с и все что между ними должно входить, значит будет входить. 

Автор: Валерия 24.11.2010, 18:59
Но ведь должно запомниться всё, что находиться между скобок? (По крайней мере так в php и perl)
Или здесь такое нужно делать по другому?

Автор: Alexeis 24.11.2010, 19:13
Цитата(Валерия @  24.11.2010,  19:59 Найти цитируемый пост)
Но ведь должно запомниться всё, что находиться между скобок? (По крайней мере так в php и perl)

  Насколько я помню в документации такого поведения не описывалось.

Автор: Валерия 24.11.2010, 19:48
Цитата(Alexeis @  24.11.2010,  19:13 Найти цитируемый пост)
Насколько я помню в документации такого поведения не описывалось. 

Возникает тогда вопрос: как сделать то что я хочу?)

Автор: Alexeis 24.11.2010, 21:39
Валерия, скопировать из строки подстроку нужной длинны начиная с нужного символа.

Автор: Валерия 24.11.2010, 21:47
Цитата(Alexeis @  24.11.2010,  21:39 Найти цитируемый пост)
Валерия, скопировать из строки подстроку нужной длинны начиная с нужного символа. 

Это не вариант, т.к начало символа может быть всегда разное.
Мне нужно именно что бы выполнялся поиск по регулярному выражению.

В php и perl та регулярка, которую я написала, будет работать именно так как я захочу smile

Я была бы очень рада, если бы мне кто-то показал на моём примере, как это сделать на С++ именно с этой либой.

Автор: Alexeis 24.11.2010, 22:01
Валерия, значит попробовать другой вариант из буста. Он почти стандарт уже http://blog.alno.name/ru/2008/10/using-boost-regex

Автор: Валерия 24.11.2010, 22:11
Цитата(Alexeis @  24.11.2010,  22:01 Найти цитируемый пост)
Валерия, значит попробовать другой вариант из буста. Он почти стандарт уже http://blog.alno.name/ru/2008/10/using-boost-regex 

Наше общение с Вами выглядит так, будто я пришла в магазин покупать туфли от Версаче, а Вы мне говорите "знаете, лучше купите кроссовки Аддидас".
Я ведь попросила показать мне именно на моём примере, а в моём примере я не использую бустовые регулярки.
Прошу не воспринимать как обиду smile

Автор: Alexeis 24.11.2010, 22:49
Валерия, я пользовался этой либой, изучал доку вдоль и поперек. Извлекать фрагменты регулярки она не умеет, только целиком. Сам я после прохода такой регуляркой извлекал нужный мне кусок руками. Например, в вашем случае нужно копировать начиная с первого символа n - 2 символов, где n длина строки. 

Автор: Валерия 24.11.2010, 23:15
Неужели регулярка не может извлекать фрагмент? о_О
Не дописали что-ли?)
Дело в том что у меня количество символов всегда может быть разное, поэтому статично нельзя указать номера символов.
А Boost нормально работает на Builder XE под Windows? Если я не ошибаюсь, это ведь никсовая библиотека.
Если нормально дружит, можно ли сразу весь Boost установить, т.е что бы библиотеки, например, работы с потоками тоже сразу установились, а не ставить их по одной?

Автор: Alexeis 24.11.2010, 23:24
Цитата(Валерия @  25.11.2010,  00:15 Найти цитируемый пост)
А Boost нормально работает на Builder XE под Windows?

  Начиная с версии 2009 поставляется специальная адаптированная версия для билдера. И с каждым апдейтом обновляется. Это кросплатформенная либа как и STL.

Автор: oldcode 25.11.2010, 18:48
Цитата(Валерия @ 24.11.2010,  22:11)
Наше общение с Вами выглядит так, будто я пришла в магазин покупать туфли от Версаче, а Вы мне говорите "знаете, лучше купите кроссовки Аддидас".

1. Все с точностью до наоборот smile .
2. Зря вы не обратили внимание на пост №2 здесь http://forum.vingrad.ru/forum/topic-315862.html.

Автор: QVO 14.2.2014, 23:00
Понимаю что тема старая, но автор не получил ответа на заданный вопрос.

Код

#include <RegularExpressions.hpp>

// URL = https:\\mysite.com\#param=1&length=7

TRegEx regex("param=(.+?)&");
TMatch match = regex.Match(" https:\\mysite.com\#param=1&length=7");
ShowMessage(match.Groups[1].Value);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)