2013-05-30 100 views
2

我正在寫一個日期解析器使用boost正則表達式,我記得(模糊地),該提升允許正則表達式組成。作爲我在這裏尋找的示例是Perl示例代碼:如何從多個正則表達式組成正則表達式與提升

my $year  = qr/\d{1,4}(?:\d\(?B\.C\.\)?)?/; 
my $gmonth = qr/(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)/i; 
my $fmonth = qr/(?:VEND|BRUM|FRIM|NIVO|PLUV|VENT|GERM|FLOR|PRAI|MESS|THER|FRUC|COMP)/i; 
my $hmonth = qr/(?:TSH|CSH|KSL|TVT|SHV|ADR|ADS|NSN|IYR|SVN|TMZ|AAV|ELL)/i; 
my $month = qr/(?:$gmonth|$fmonth|$hmonth)/i; 
my $day  = qr/\d{1,4}/; 
my $DE  = qr/(?:\@\#DHEBREW\@|\@\#DROMAN\@|\@\#DFRENCH_R\@|\@\#DGREGORIAN\@|\@\#DJULIAN\@|\@\#DUNKNOWN\@)/; 
my $DR  = qr/(?:AFT|BEF)\s/i; 
my $DA  = qr/(?:ABT|CAL|EST)\s/i; 
my $DI  = qr/INT\s/i; 
my $prefix = qr/(?:$DR|$DA|$DI)/i; 
my $date  = qr/$prefix?(?:$DE\s)?(?:$day\s)?(?:$month\s)?$year/; 
my $date_p = qr/FROM\s$date\sTO\s$date/i; 
my $date_f = qr/FROM\s$date/i; 
my $date_t = qr/TO\s$date/i; 
my $date_r = qr/BET\.?\s$date\s(?:AND|-)\s$date/i; 
my $GED_date = qr/(?:$date|$date_p|$date_r|$date_f|$date_t)/; 

while (<DATA>) { 
    next if /DATE\s$GED_date/; 
    print $_; 
} 

正如你所看到的組成是非常需要的。這只是產生一個正則表達式來測試'合法性'。所以我的問題幾乎可以用boost來做類似的事情?指針或鏈接會很好。我可以從中推斷出的小例子非常好。與此同時,我將繼續擊中增強版書籍!

+1

也許可以在此頁面幫助您:http://www.boost.org/doc/libs/1_44_0 /doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.building_a_grammar –

+0

@CasimiretHippolyte Spot on!儘管---問題是否可以指定我的子表達式比表達式風格稍微不透明? – hsmyers

+0

xpressive文檔中的「[動態正則表達式文法]」(http://www.boost.org/doc/libs/1_44_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.dynamic_regex_grammars)如何使用引用其他正則表達式的動態(基於字符串的)正則表達式構建語法,這可能更像您期望的。 –

回答

1

您可以像pcre一樣使用DEFINE語法。看到這個頁面:http://www.boost.org/doc/libs/1_53_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html條件表達式的最後一行)

例子:

(?x) 
(?(DEFINE)(?<gmonth>(?i)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))) 
(?(DEFINE)(?<fmonth>(?i)(?:VEND|BRUM|FRIM|NIVO|PLUV|VENT|GERM|FLOR|PRAI|MESS|THER|FRUC|COMP))) 
(?(DEFINE)(?<hmonth>(?i)(?:TSH|CSH|KSL|TVT|SHV|ADR|ADS|NSN|IYR|SVN|TMZ|AAV|ELL))) 
(?(DEFINE)(?<month>\k<gmonth>|\k<fmonth>|\k<hmonth>)) 
+0

完美!只有比N語言好的東西纔是N + M語言! – hsmyers

+0

當然,這是革命性的。 –

相關問題