FC2ブログ

Qtの正規表現の使い方まとめ

・正規表現がマッチするか調べる
  QString s("2012/06/30 13:45:30");

  QRegExp r1("..../../.. ..:..:..");
  QRegExp r2("..../../..");

  cout << r1.exactMatch(s) << endl;  // -> true
  cout << r2.exactMatch(s) << endl;  // -> false

exactMatchで正規表現が文字列に完全マッチするかどうか調べることができます。



・部分的にマッチする箇所の検索
  QString s("2012/06/30 13:45:30");

  QRegExp r1("..../../.. ..:..:..");
  QRegExp r2("..:..:..");
  QRegExp r3("www");

  cout << r1.indexIn(s) << endl;  // -> 0
  cout << r2.indexIn(s) << endl;  // -> 11
  cout << r3.indexIn(s) << endl;  // -> -1

indexInでマッチが始まる先頭文字のインデックスを取得できます。
マッチしない場合は-1が戻ってきます。



・マッチした文字列の抽出
  QString s("2012/06/30 13:45:30");
  QRegExp r("..:..:..");

  r.indexIn(s);

  cout << r.cap(0) << endl;  // -> "13:45:30"

indexInでマッチ位置を取得できますが、マッチした場合は内部バッファに検索結果に関する情報が保存されます。
その後、cap(0)でマッチした文字列を取得できます。



・部分文字列の抽出
  QString s("2012/06/30 13:45:30");
  QRegExp r("(..../../..) (..:..:..)");

  r.exactMatch(s);

  QStringList l = r.capturedTexts();
  for(int i = 0; i < l.size(); ++i)
  {
    cout << l[i] << endl;
  }

  // l[0] == "2012/06/30 13:45:30"
  // l[1] == "2012/06/30"
  // l[2] == "13:45:30"

exactMatch関数もindexIn関数と同様、マッチした場合は結果が内部に保存されます。
capturedTextsで取得できる内容は、cap関数と同様ですが、こちらは配列で結果を取得できます。
cap関数、capturedTexts関数共に、0番に正規表現全体に対応する文字列、1番以降に()で指定した部分文字列が入ります。



・パターン付きで置換
  QString s("2012/01/23");
  QRegExp r("(....)/(..)/(..)");

  s.replace(r, QObject::tr("\\1年\\2月\\3日"));
  cout << s << endl;  // -> "2012年01月23日"

置換時に()で囲った文字列を部分文字列として、置換後文字列内に\\1、\\2のように埋め込むことができます。



・大文字、小文字を区別するかどうか指定
  QString s("HELLLLLLLLO");

  QRegExp r("hel*o");

  cout << r.exactMatch(s) << endl;  // -> false

  r.setCaseSensitivity(Qt::CaseInsensitive);
  cout << r.exactMatch(s) << endl;  // -> true

setCaseSensitivityで大文字、小文字の区別の有無を指定できます。
標準設定では、大文字、小文字を区別する設定になっています。



・最短マッチ、最長マッチの指定
  QString s("a1a2a3a4a");
  QRegExp r("a.+a");

  r.indexIn(s);
  cout << r.cap(0) << endl;  // -> "a1a2a3a4a"

  r.setMinimal(true);
  r.indexIn(s);
  cout << r.cap(0) << endl;  // -> "a1a"

setMinimalでマッチする文字列が最短になるのか、最長になるのかを指定できます。
標準設定では、最長マッチする設定になっています。


スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
最新記事
カテゴリ
Qt (21)
SDL (2)
MFC (2)
検索フォーム
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
リンク(管理用)
FC2カウンター