Консультация № 143293
07.09.2008, 19:28
0.00 руб.
07.09.2008, 19:29
0 1 1
Здравствуйте!
Столкнулся с такой задачей, что нужно переложить скрипт с PHP на C++. Установил Microsoft Visual Studio v6.0, начал изучать документацию по C++ и столкнулся с тем, что в этом языке нет поддержки регулярных выражений. Запрос к Гуглу или Яндексу показал, что можно использовать сторонние библиотеки, такие как PCRE (www.pcre.org).

В силу того, что с C++ я не знаком, у меня появился вопрос, как включить поддержку регулярных выражений в программу?
Да, на сайте www.pcre.org есть описание установки этой библиотеки, но Английский язык для меня трудноват, да и с C++ я знаком буквально неделю.
Хотелось бы узнать от вас, как можно правильно подключить эту библиотеку в свою программу и заставить работать простой пример с http://www.webcode.ru/re/pcre/.

Обсуждение

Неизвестный
08.09.2008, 15:24
общий
это ответ
Здравствуйте, Cimus!

да, действительно, Си не поддерживают регулярные выражения, но похоже лишь потому, что он обладает другой техноглогией ввода-вывода: scanf-printf, эта пара функций в общем случае предоставляет более широкий механизм форматирования и поиска (есть разве что один недостаток по отношению к регулярным выражениям: повторный ввод шаблона невозможен)

документация на русском языке сейчас уже не проблема, любой поисковик может предоставить вам множество русскоязычных сайтов-прототипов SDK с полным или частичным описанием функций, достаточно просто ввести название функции в форму поиска (но ориентироваться по структуре смежных API лучше всетаки с оригинала: http://msdn.microsoft.com/)

вот, к примеру, что выдал google:
для scanf: http://www.codenet.ru/progr/cpp/spru/scanf.php
для printf: http://www.codenet.ru/progr/cpp/spru/printf.php

эти функции форматируют ввод-вывод в файлы,
аналогично существует набор функций для ввода-вывода в/из памяти: sscanf-sprintf, но их формат практически не отличается от scanf-printf,
поэтому достаточно изучить только эту пару функций

соответствие шаблону в этом случае можно определять несколькими способами:

1. анализировать результат scanf-sscanf (он равен числу считанных выражений, заданных шаблоном), к примеру: на шаблон "мама мыла %*d рам" результат будет 1, если строка соответствует шаблону, а вот шаблон еще и с ожиданием строки: "мама %*s мыла %*d рам" или "мама %*[^0x20] мыла %*d рам" (соответствие: "мама Зина мыла 5 рам", "мама Наташа мыла 9 рам" и т.п.) здесь уже 2 выражения, следовательно scanf-sscanf вернет 2 в случае успеха.

2. анализировать результат контрольного выражения, например sscanf(src,"мама мыла %*d рам%n",&n) выставит в переменную n номер символа, на котором анализ строки был завершен, так, при этом инициализируя n = -1 можно убедиться в соответствии строки шаблону: если n не изменился, значит строка не подходит, иначе - подходит вплоть до выражения "%n"

3. существует еще один неявный способ: анализ считывающего маркера _ptr в структуре FILE, который после вызова sscanf-sprintf указывает на конец строки, либо на первый символ, не соответствующий шаблону.

PS: выражение "%n" не учитается на возврате из scanf-sscanf, поэтому во втором случае успешный результат будет так же 1, все остальные выражения обязательно учитаются
PS: как мы видим, формат scanf немного похож на регулярные выражения, но на самом деле все с точностью до наоборот: регулярные выражения - урезанный аналог scanf.
Форма ответа