Я знаком с самим Regex, но каждый раз, когда я пытаюсь найти, что любые примеры или документация используют regex с компьютерами Unix, я просто надеваю учебные руководства, как записать regex или как использовать.NET определенные библиотеки, доступные для Windows. Я искал некоторое время, и я не могу найти хорошие учебные руководства на C++ regex на машинах Unix.
Что я пытаюсь сделать:
Проанализируйте строку с помощью regex путем разбивания его и затем чтения различных подгрупп. Сделать аналогию PHP, что-то как preg_match, который возвращает весь $matches.
Рассмотрите возможность использования 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);
}
Поищите в документации регулярные выражения 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
Большинство разработчиков Java предпочтут видеть getters и setters.
Никто не может разрабатывать код в вашей упаковке, но другие потребляют . Открывая явно открытый интерфейс, вы можете гарантировать, что внешние потребители используют ваш интерфейс так, как вы ожидаете.
Если вы публично раскрыли внутреннюю реализацию класса:
Поддержание гетеров и установщиков может занять немного больше времени, но предлагает гораздо больше безопасности плюс:
Вы должны решить, стоит ли преимущества за дополнительное время.
-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 мира, расширенный язык ближе к тому, к чему вы привыкли.
Храните соленый хэш. Я бы лично отошел от md5 и использовал что-то вроде ша. sha1 + соль продержится некоторое время =]
Если вы храните изображения в виде blobs в БД, вам, вероятно, будет легче в будущем создать их резервную копию (вдоль БД, получить их и т.д.). Но на самом деле, они будут чертовски быстры и в файловой системе, но я бы предпочел их в базе данных, так как у меня много кода, который взаимодействует с БД, и мне удобно работать в этой области. Это зависит от тебя.
Я не уверен, что wordpress поможет вам построить сайт социальной сети... но его все еще хорошо читать код других. Я бы взглянул на несколько книг по архитектуре Amazon, только чтобы ваш разум задумался о больших масштабах. Кроме того, взгляните на книги с образцами дизайна.
Я бы также изучил что-то вроде Zend Framework или CakePHP. Торт, вероятно, поднимет вас и побежит довольно быстро, но я предпочитаю Zend, как его очень мощный и не заставляет вас кодировать определенный стиль. CakePHP своего рода как рельсы для PHP.
Вы также хотите получить достойную безопасность, как на стороне сервера, так и на стороне клиента, наблюдая за такими вещами, как захват сеанса, sql injection, xss, попытки грубой силы, удаленные включения, загруженные файловые эксплойты и т.д.
Социальные сайты предлагают множество векторов атак взломщикам.
Ресурсы:
http://www.amazon.com/Pro-PHP-Security-Chris-Snyder/dp/1590595084/ref=sr_1_1 ?
и ваш местный список рассылки PHP/собрание.
Поиск в документации 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 .
Не стесняйтесь взглянуть на эту небольшую программу для работы с цветом, которую я написал.
На github
Он использует regcomp, regexec и regfree, на которые ссылается R Samuel Klatchko.
Я использую "GNU regex": http://www.gnu.org/s/libc/manual/html_node/Regular-Expressions.html
Работает хорошо, но не может найти ясного решения для UTF-8 regexp.
Regards