読者です 読者をやめる 読者になる 読者になる

なんとな~くしあわせ?の日記

ClojureとかAWSの設定とかをメモする技術ブログ

なんか前もやってた気がするけど

正規表現 Perl C++


2chのスレッド一覧を正規表現で取り出す

#!/usr/bin/perl -w

use strict;

open (FH, "< test.dat");
my @list = <FH>;
my $line;

foreach $line (@list) {

   # サンプル:9241201701.dat<>ステマと言われて困っています。- 2ちゃんねる知恵袋 (10)

   if ($line =~ /([\d]+).dat<>(.+) \(([\d]+)\)/) {

      print $1 . "\n"; # 9241201701
      print $2 . "\n"; # ステマと言われて困っています。- 2ちゃんねる知恵袋
      print $3 . "\n"; # 10
   }
}

こいつをwxWidgetsのwxRegEx(POSIX批准のC++正規表現)で取ろうとするとうまく行かない、もう少し改良が必要か。

追記:2012/02/07
答えは意外と簡単で、括弧自体のエスケープをしっかりやれば良かった
参考サイト:正規表現で括弧自身を表す方法を教えて下さい

/*
 * Search.cpp
 *
 *  Created on: 2012/01/17
 *      Author: learning
 */

#include "Search.h"

int Search::OnRun() {

  // テキストファイルの読み込み
  wxTextFile datfile(wxT("./shar.dat"));
  datfile.Open();

  // スレッド一覧読み込み用正規表現を準備する
  wxRegEx reThreadLine(wxT("([[:digit:]]+).dat<>(.+)\\(([[:digit:]]{1,3})\\)"), wxRE_ADVANCED + wxRE_ICASE);

  // 9241201701.dat<>ステマと言われて困っています。- 2ちゃんねる知恵袋 (10)

  // テキストファイルの終端まで読み込む
  for ( wxString line = datfile.GetFirstLine(); !datfile.Eof(); line = datfile.GetNextLine() ) {
    // 正規表現で情報を取得する
    reThreadLine.Matches(line);

    wxString oid = reThreadLine.GetMatch(line, 1);      // 9241201701
    wxString title = reThreadLine.GetMatch(line, 2);    // ステマと言われて困っています。- 2ちゃんねる知恵袋 
    wxString response = reThreadLine.GetMatch(line, 3); // 10

    cout << oid << endl;
    cout << title << endl;
    cout << response << endl;
  }

  return 0;
}

あとvimで行番号を消すコマンドいつも忘れるからメモ「:set nonu」