2013-07-18 3 views
0

У меня есть следующие регулярные выражения: Первый из них выдает даты со следующим шаблоном XX/XX/XXXX или XX-XX-XXX или XX XX XXX Второй - только извлекает имена месяцевОбъединить 2 регулярных выражения

bool Keywords::extractDate(const char *date) 
{ 
    const boost::regex e("^([0]?[1-9]|[1|2][0-9]|[3][0|1])([\\.\\-\\/\\ ])([0]?[1-9]|[1][0-2])([\\.\\-\\/\\ ])([0-9]{4}|[0-9]{2})$"); 
    return boost::regex_match(date,e); 
} 
bool Keywords::extractDate2(const char*date2) 
{ 
    const boost::regex e("((j|J)anvier|(f|F)\u00E9vrier|(f|F)évrier|(f|F)evrier|(m|M)ars|(a|A)vril|(m|M)ai|(j|J)uin|(j|J)uillet|juillet|(a|A)o\u00FBt|(a|A)oût|aout|(s|S)eptembre|(o|O)ctobre|(n|N)ovembre|(d|D)\u00E9cembre|(d|D)écembre|(d|D)ecembre|JANVIER|FEVRIER|MARS|AVRIL|MAI|JUIN|JUILLET|AOUT|SEPTEMBRE|OCTOBRE|NOVEMBRE|DECEMBRE)"); 
    return boost::regex_match(date2,e); 
}///end function 

Можно ли их комбинировать?

спасибо.

+10

Объединить их как? Вы хотите совместить оба шаблона? Любой шаблон? Один шаблон в строке, за которым следует другой? –

+0

Содержит ли строка, совпадающая ('XX/XX/XXXX') с названиями месяцев? –

+1

Это не \ u00E9 == é? BTW, вы можете улучшить регулярное выражение, разложив общие части. Это улучшает откат. То есть 'Mars | Mai' =>' Ma (rs | i) '. Это означает, что регулярное выражение не должно возвращаться, когда оно встречается с i в Mai. Наконец, у вас есть избыточный «juillet», но нет «Aout». – MSalters

ответ

2

Описание

Да, вы можете комбинировать их. Это регулярное выражение будет:

  • матч дата в формате dd-mm-yyyy где разделители могут быть ., -, пространство, или /
  • позволяют год быть 2 или 4 цифры
  • если не формат dd-mm-yyyy строка затем искать строку за месяц имени

^([12][0-9]|3[01]|0?[1-9])[-\\\/\s.](1[0-2]|0?[1-9])[-\\\/\s.]([0-9]{2}?[0-9]{2})$|([jJ]anvier|[fF]évrier|[fF]évrier|[fF]evrier|[mM]ars|[aA]vril|[mM]ai|[jJ]uin|[jJ]uillet|[aA]o[éû]t|aout|[sS]eptembre|[oO]ctobre|[nN]ovembre|[dD][eé]cembre|JANVIER|FEVRIER|MARS|AVRIL|MAI|JUIN|JUILLET|AOUT|SEPTEMBRE|OCTOBRE|NOVEMBRE|DECEMBRE)

Живая демонстрация: http://www.rubular.com/r/0i5uIj9ZJX

enter image description here

Я сделал несколько незначительных изменений в выражениях типа:

  • изменяющимися конструкций, как (f|F) к [fF]
  • удалены символы Юникода, как я на самом деле не familure с работой с ними
  • изменил согласование даты, чтобы нажать 0?[1-9] до конца, чтобы предотвратить сначала сопоставив это чередование.
  • изменили конструкции, как [1|2] к [12]

Примечание я должен был удалить символы Unicode, чтобы заставить его работать на моей системе. Я не использую акцентированный юникод, поэтому я не уверен, как они работают как экранированные строки в регулярном выражении.

Смежные вопросы