Unix

2010-02-08 18 views
10

'da C++ ile normal ifadeleri kullanmak Regex'in kendisiyle aşinayım, ancak Unix bilgisayarları ile regex kullanmak için herhangi bir örnek veya belge bulmaya çalıştığımda, regex'in nasıl yazılacağı veya nasıl kullanılacağı konusunda dersler alıyorum. Windows için NET'e özgü belirli kitaplıklar. Bir süredir araştırıyorum ve Unix makinelerinde C++ regex ile ilgili iyi dersler bulamıyorum.Unix

ben yapmaya çalışıyorum Ne:

yukarı kırarak ve daha sonra farklı alt grupları okuyarak regex kullanarak bir dize ayrıştırma. PHP benzetmesi yapmak için, tüm $ eşleşmelerini döndüren preg_match gibi bir şey.

+0

'preg_match_all (...)' sonra, ne de 'preg_match (...)'. –

+1

Muhtemelen C++ Standardı normal ifade sınıflarını belirtmediği için. –

+0

Neil, ancak tüm php standartlarını sağlamaz ;-) –

cevap

13

Boost.Regex'u kullanmayı düşünün.

(web sitesinden) bir örnek:

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

Başka bir örnek:

// 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); 
} 
0

regcomp, regexec and regfree ürününü incelemektesiniz.

Dikkat edilmesi gereken tek şey, Posix normal ifadelerinin aslında iki farklı dili, normal (varsayılan) ve genişletilmiş (regcomp çağrısı içinde REG_EXTENDED bayrağı dahil) içermesidir. PHP dünyasından geliyorsanız, alışkın olduğunuz dile daha yakın dil.

+0

@epatel –

9

TR1 regex veya (hemen hemen eşdeğer) destekleme ekleri belgelerine bakın. Her ikisi de çeşitli Unix sistemlerinde oldukça iyi çalışır. TR1 regex sınıfları C++ 0x olarak kabul edildi, bu yüzden standartların tam olarak bir parçası olmasalar da, makul bir şekilde yakında olacaklar.

Düzenleme: Bir dizeyi alt gruplara ayırmak için bir sregex_token_iterator kullanabilirsiniz. Jeton olarak eşleştirmek istediğinizi veya ayırıcı olarak eşleştirilmesini istediğinizi belirtebilirsiniz. bunu böyle girdi verirsek

#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; 
} 

: Burada her ikisinin bir şipşak demo "Bu, bazı 999 metindir" Sonuç aşağıdaki gibidir: perl uyumlu düzenli ifadeler için

Matching words: 
This 
is 
some 
text 

Matching separators: 
This 
is 
some 
999 
text 
+0

ile aynı yorumu yapabilir. Ayrıca Boost Xpressive (http://www.boost.org/doc/libs/1_42_0/doc/html/xpressive.html) 'yi kullanabilir. düzenli ifadeleri. Hiç şüphesiz bu standart olacak çünkü :) – Manuel

+0

Bu en ideal imo. Ama aslında daha önce buna katıldım ve bunu yapmak zorunda olduğum sunucu bunu desteklemiyor. :/ –

+0

@Manuel: Yorum işaretleme sözdizimi bazen berbat, değil mi? Ayrıca 1.38 kullanıyor musunuz ?! En son sürüm sürümü için destek URL'lerinde '/ release /' kullanın. –

0

yazdığım bu küçük renk grep aracı bir göz çekinmeyin.

github

de O regcomp, regexec regfree R, Samuel Klatchko belirtir kullanır. Ben "GNU regex" kullanmak

+0

Alt gruplara dönüp bunları işlemek için herhangi bir örnek var mı? –

+0

@Stanislav Palatnik 95 95 – epatel