Используя регулярные выражения с C++ на Unix

Я знаком с самим Regex, но каждый раз, когда я пытаюсь найти, что любые примеры или документация используют regex с компьютерами Unix, я просто надеваю учебные руководства, как записать regex или как использовать.NET определенные библиотеки, доступные для Windows. Я искал некоторое время, и я не могу найти хорошие учебные руководства на C++ regex на машинах Unix.

Что я пытаюсь сделать:

Проанализируйте строку с помощью regex путем разбивания его и затем чтения различных подгрупп. Сделать аналогию PHP, что-то как preg_match, который возвращает весь $matches.

10
задан stan 8 February 2010 в 20:46
поделиться

8 ответов

Рассмотрите возможность использования Boost.Regex .

Пример (с сайта):

bool validate_card_format(const std::string& s)
{
   static const boost::regex e("(\\d{4}[- ]){3}\\d{4}");
   return regex_match(s, e);
}

Другой пример:

// match any format with the regular expression:
const boost::regex e("\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z");
const std::string machine_format("\\1\\2\\3\\4");
const std::string human_format("\\1-\\2-\\3-\\4");

std::string machine_readable_card_number(const std::string s)
{
   return regex_replace(s, e, machine_format, boost::match_default | boost::format_sed);
}

std::string human_readable_card_number(const std::string s)
{
   return regex_replace(s, e, human_format, boost::match_default | boost::format_sed);
}
13
ответ дан 3 December 2019 в 17:58
поделиться

Поищите в документации регулярные выражения TR1 или (почти то же самое) регулярное выражение Boost. Оба прекрасно работают в различных системах Unix. Классы регулярных выражений TR1 были приняты в C ++ 0x, поэтому, хотя они еще не являются частью стандарта, они скоро появятся.

Изменить: чтобы разбить строку на подгруппы, вы можете использовать sregex_token_iterator. Вы можете указать либо то, что вы хотите сопоставить в качестве токенов, либо то, что вы хотите сопоставить, в качестве разделителей. Вот краткая демонстрация обоих:

#include <iterator>
#include <regex>
#include <string>
#include <iostream>

int main() { 

    std::string line;

    std::cout << "Please enter some words: " << std::flush;
    std::getline(std::cin, line);

    std::tr1::regex r("[ .,:;\\t\\n]+");
    std::tr1::regex w("[A-Za-z]+");

    std::cout << "Matching words:\n";
    std::copy(std::tr1::sregex_token_iterator(line.begin(), line.end(), w),
        std::tr1::sregex_token_iterator(), 
        std::ostream_iterator<std::string>(std::cout, "\n"));

    std::cout << "\nMatching separators:\n";
    std::copy(std::tr1::sregex_token_iterator(line.begin(), line.end(), r, -1), 
        std::tr1::sregex_token_iterator(), 
        std::ostream_iterator<std::string>(std::cout, "\n"));

    return 0;
}

Если вы введете такой ввод: «Это примерно 999 текст», результат будет таким:

Matching words:
This
is
some
text

Matching separators:
This
is
some
999
text
9
ответ дан 3 December 2019 в 17:58
поделиться

Большинство разработчиков Java предпочтут видеть getters и setters.

Никто не может разрабатывать код в вашей упаковке, но другие потребляют . Открывая явно открытый интерфейс, вы можете гарантировать, что внешние потребители используют ваш интерфейс так, как вы ожидаете.

Если вы публично раскрыли внутреннюю реализацию класса:

  • Невозможно помешать потребителям использовать класс ненадлежащим образом
  • Отсутствует контроль над точками входа/выхода; любое публичное поле может быть мутировано в любое время
  • Увеличение связи между внутренней реализацией и внешними потребителями

Поддержание гетеров и установщиков может занять немного больше времени, но предлагает гораздо больше безопасности плюс:

  • Вы можете повторно создать код в любое время, так сильно, как вам захочется, если вы не сломаете общедоступный API (getters, setters и public methods)
  • Модульное тестирование хорошо инкапсулированных классов проще - вы тестируете открытый интерфейс и все (только ваши входы/выходы в «черный ящик»)
  • Наследование, композиция и дизайн интерфейса все будет иметь больше смысла и быть проще в разработке с разъединенными классами
  • Решите, что вам нужно добавить некоторую валидацию к мутатору, прежде чем он будет установлен? Одно хорошее место - внутри установщика.

Вы должны решить, стоит ли преимущества за дополнительное время.

-121--4116883-

Я успешно использовал PortAudio.

Я взял несколько отрывков из моей игрушечной программы, чтобы сделать очень простой «эхо» пример, ниже:

(запустить с наушниками. это цикл обратной связи от микрофона к динамикам и может стать очень громким после нескольких раундов обратной связи)

import Control.Monad (forever)
import Data.Int (Int16)
import Foreign.Ptr (nullPtr)
import Sound.PortAudio

initPortAudio :: Int -> IO (PaStream Int16)
initPortAudio blockSize = do
  Right NoError <- initialize
  Just micDevIdx <- getDefaultInputDevice
  Just spkDevIdx <- getDefaultOutputDevice
  Right paStream <-
    openStream
    (Just (StreamParameters micDevIdx 1 PaInt16 0.1 nullPtr))
    (Just (StreamParameters spkDevIdx 1 PaInt16 0.1 nullPtr))
    44100 blockSize
    :: IO (Either String (PaStream Int16))
  Right NoError <- startStream paStream
  let zeroBlock = replicate blockSize [0]
  Right NoError <- writeStream paStream zeroBlock blockSize
  return paStream

main :: IO ()
main = do
  paStream <- initPortAudio blockSize
  forever $ do
    Right numSampsAvail <- getStreamReadAvailable paStream
    Right curSamps <- readStream paStream 1 numSampsAvail
    Right NoError <- writeStream paStream curSamps numSampsAvail
    return ()
  where
    blockSize = 0x800

Работает здесь в Leopard с GHC 6.10.4.

Моя собственная игрушечная программа фактически использует только вход звука и выводит нули на выход звука (не делая этого PortAudio жалуется).

-121--3723732-

Вы ищете regcomp, regexec и regfree .

Следует быть осторожными в том, что регулярные выражения Posix фактически реализуют два разных языка: обычный (по умолчанию) и расширенный (включают флаг REG_EXTENDED в вызов regcomp). Если вы родом из PHP мира, расширенный язык ближе к тому, к чему вы привыкли.

0
ответ дан 3 December 2019 в 17:58
поделиться
  1. Храните соленый хэш. Я бы лично отошел от md5 и использовал что-то вроде ша. sha1 + соль продержится некоторое время =]

  2. Если вы храните изображения в виде blobs в БД, вам, вероятно, будет легче в будущем создать их резервную копию (вдоль БД, получить их и т.д.). Но на самом деле, они будут чертовски быстры и в файловой системе, но я бы предпочел их в базе данных, так как у меня много кода, который взаимодействует с БД, и мне удобно работать в этой области. Это зависит от тебя.

  3. Я не уверен, что wordpress поможет вам построить сайт социальной сети... но его все еще хорошо читать код других. Я бы взглянул на несколько книг по архитектуре Amazon, только чтобы ваш разум задумался о больших масштабах. Кроме того, взгляните на книги с образцами дизайна.

Я бы также изучил что-то вроде Zend Framework или CakePHP. Торт, вероятно, поднимет вас и побежит довольно быстро, но я предпочитаю Zend, как его очень мощный и не заставляет вас кодировать определенный стиль. CakePHP своего рода как рельсы для PHP.

Вы также хотите получить достойную безопасность, как на стороне сервера, так и на стороне клиента, наблюдая за такими вещами, как захват сеанса, sql injection, xss, попытки грубой силы, удаленные включения, загруженные файловые эксплойты и т.д.

Социальные сайты предлагают множество векторов атак взломщикам.

Ресурсы:

-121--4903884-

Поиск в документации TR1 регексов или (почти эквивалентно) повышающих регексов. Оба очень хорошо работают на различных Unix-системах. Классы TR1 regex были приняты в C++ 0x, так что, хотя они еще не являются частью стандарта, они будут достаточно скоро.

Правка: чтобы разбить последовательность на подгруппы, можно использовать sregex_token_iterator. Можно указать, что нужно сопоставить в качестве маркеров, или что нужно сопоставить в качестве разделителей. Вот быстрая демонстрация того и другого:

#include <iterator>
#include <regex>
#include <string>
#include <iostream>

int main() { 

    std::string line;

    std::cout << "Please enter some words: " << std::flush;
    std::getline(std::cin, line);

    std::tr1::regex r("[ .,:;\\t\\n]+");
    std::tr1::regex w("[A-Za-z]+");

    std::cout << "Matching words:\n";
    std::copy(std::tr1::sregex_token_iterator(line.begin(), line.end(), w),
        std::tr1::sregex_token_iterator(), 
        std::ostream_iterator<std::string>(std::cout, "\n"));

    std::cout << "\nMatching separators:\n";
    std::copy(std::tr1::sregex_token_iterator(line.begin(), line.end(), r, -1), 
        std::tr1::sregex_token_iterator(), 
        std::ostream_iterator<std::string>(std::cout, "\n"));

    return 0;
}

Если вы дадите ему ввод так: «Это какой-то 999 текст», результат будет следующим:

Matching words:
This
is
some
text

Matching separators:
This
is
some
999
text
-121--3090653-

Для perl-совместимых регулярных выражений (pcre/preg), я бы предложил boost.regex .

0
ответ дан 3 December 2019 в 17:58
поделиться

Лучше всего boost :: regex .

0
ответ дан 3 December 2019 в 17:58
поделиться

Попробуйте pcre . И pcrepp .

0
ответ дан 3 December 2019 в 17:58
поделиться

Не стесняйтесь взглянуть на эту небольшую программу для работы с цветом, которую я написал.

На github

Он использует regcomp, regexec и regfree, на которые ссылается R Samuel Klatchko.

0
ответ дан 3 December 2019 в 17:58
поделиться

Я использую "GNU regex": http://www.gnu.org/s/libc/manual/html_node/Regular-Expressions.html

Работает хорошо, но не может найти ясного решения для UTF-8 regexp.

Regards

0
ответ дан 3 December 2019 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: