Регулярные выражения и С++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DarkLight, 24 Jun 2012.

  1. DarkLight

    DarkLight New Member

    Joined:
    13 Jan 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    Здравствуйте, подскажите алгоритмы аналогичные регулярным выражениям (поиск по маске, etc), только без подключения сторонних библиотек. Язык С++. Или в какую сторону смотреть. Где то тут был топик на похожую тематику но я не нашёл ((
    Спасибо за внимание!!
     
    #1 DarkLight, 24 Jun 2012
    Last edited: 24 Jun 2012
  2. enigma

    enigma Member

    Joined:
    10 Jul 2011
    Messages:
    80
    Likes Received:
    15
    Reputations:
    7
  3. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    Сторонние библиотеки - не зло. Boost.Regex поможет решить задачу спокойно, без изобретения велосипеда.
     
  4. DarkLight

    DarkLight New Member

    Joined:
    13 Jan 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    ))

    Спасибо за ответы, буду курить))
     
  5. enigma

    enigma Member

    Joined:
    10 Jul 2011
    Messages:
    80
    Likes Received:
    15
    Reputations:
    7
    Регулярки щас есть в новом стандарте. достаточно скачать десятую студию. и написать #include<regex>
    Смотря что нужно тс. как по мне то большинство задач можно решить и без регулярок. Обходились же древние люди без консервных ножей :) .
     
  6. DarkLight

    DarkLight New Member

    Joined:
    13 Jan 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    =)

    Спасибо Enigma, вот например найти слово по маске. Просто подключать к проекту лишние либы тяги нет. Вес программы увеличивается. Среда разработки VS6.0
     
    #6 DarkLight, 25 Jun 2012
    Last edited: 25 Jun 2012
  7. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Если пишешь не мальварь то на вес должно быть побоку, я думаю ты ценишь свое время если нет то вперед писать свою либу регэкспов.
     
  8. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Эта студия стандартам-то не удовлетворяет старым, чего уж о новых говорить с std::regex. Нет уверенности, что в ней даже boost соберется. Поставь новую студию, 2010 например, и потом на выбор либо boost::regex, либо std::regex (что одно и то же по сути). Для шестой могу посоветовать только pcre.

    Пиши тогда на Си, плюсы сами по себе оверхед большой дают при использовании даже стандартных библиотек.
     
  9. DarkLight

    DarkLight New Member

    Joined:
    13 Jan 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    =)

    Спасибо, тогда буду качать VS10. У меня проект весь на winapi, придётся либами разбавить. Посмотрим насколько ехе распухнет. На С не тянет, учить его надо, там же свои тонкости)))
     
    #9 DarkLight, 26 Jun 2012
    Last edited: 26 Jun 2012
  10. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327
    Code:
    //////////////////////////////////////////////////////////////////////////
    bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
    {
    	for(;*szMask;++szMask,++pData,++bMask)
    		if(*szMask=='x' && *pData!=*bMask )
    			return false;
    	return (*szMask) == NULL;
    }
    //////////////////////////////////////////////////////////////////////////
    DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
    {
    	for(DWORD i=0; i < dwLen; i++)
    		if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
    			return (DWORD)(dwAddress+i);
    
    	return 0;
    }
    
    ...
    ...
    if(rc = dwFindPattern((DWORD)baseaddress, 
    		(DWORD)datasize,
    		(PBYTE)"\x8B\xCF\xE8\x33\x00\x00\x00\x83\xf8\01\x7C\x07", "xxxxxxxxxxxx"))
    ну ты понел
     
  11. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    В винде есть доступные регулярные выражения через COM-интерфейс, точно помню, но не помню, через какой. Так что, пожалуй, можно и без либ обойтись, если найти. Если вспомню, напишу.


    UPD: Собственно, вот они: http://www.wasm.ru/article.php?article=comregexp

    В си/си++ несложно будет применить, и очень мало веса добавят к программе.
     
    #11 GRRRL Power, 26 Jun 2012
    Last edited: 27 Jun 2012
  12. DarkLight

    DarkLight New Member

    Joined:
    13 Jan 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    =)

    2 sn0w и GRRRL Power Респект, как раз практически то что нужно, вектор для дальнейших изысканий получен. Спасибо всем за отзывчивость)