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

それらを組み合わせることは可能ですか?

ありがとうございました。

4

1 に答える 1

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

ここに画像の説明を入力

私はあなたの表現に次のようないくつかのわずかな修正を加えました:

  • (f|F)のような構造の変更[fF]
  • 私はUnicode文字を扱うことに慣れていないので、Unicode文字を削除しました
  • 0?[1-9]この代替が最初に誤って一致しないように、日付の一致を最後までプッシュするように変更しました。
  • [1|2]のような変更された構造[12]

私のシステムで動作させるには、Unicode 文字を削除する必要があったことに注意してください。私はアクセント付きユニコードを使用していないので、正規表現でエスケープされた文字列としてどのように機能するかはよくわかりません。

于 2013-07-19T04:22:07.567 に答える