ナビゲーション

最近の更新 (Recent Changes)

2013-01-29
2013-01-15
2012-11-29
2011-11-19
2011-11-14
2011-10-22

Wikiガイド(Guide)

サイドバー (Side Bar)

タブ振り分けルール、検索で使用可能な正規表現について簡単に解説します。

正規表現って?

正規表現とは、いくつかの文字列をひとまとめにして表現する方法です。 例えば、「WindowsXP」「Windows XP」のように、同じようなキーワードでも、表記に「ゆれ」がある場合、複数のルールを作るよりも、正規表現を使った書き方にすると、ひとつのルールで簡潔に記述することができます。

  • Tweenで正規表現を使うためには、検索、もしくは振り分けルール作成の際に「正規表現を使用する」にチェックを入れる必要があります。

メタ文字って?

いくつかの文字列をひとまとめにして表現するのが正規表現ですが、このときに使う特別な意味を持たせた文字を「メタ文字」といいます。次の文字は、正規表現では特別な意味を持つので、その文字自体を表現したいときは直前に「\」を置く必要があります。

.   ^   $   [   ]   *   +   ?   |   (   )   \

「\」はメタ文字の特別な意味を打ち消す時に使います。

「[B!]」という単語を表現したいときは、 [ ] それぞれが「メタ文字」となっているので、「\[B!\]」と書くのですね。

それでは、どのメタ文字がどういった意味を表すのかをひとつずつ説明していきます。

何でもいい1文字「.」

「.」は、何でもいい1文字を表します。 

あれは.です
と書いた場合、「あれは車です」「あれは鳥です」「あれは1です」などに該当します。

行の先頭あるいは行の最後「^」「$」

「^」は行の先頭、「$」は行の最後を表します。

^爆発
と書いた場合、「爆発しました」など、「爆発」で始まる行に該当します。 「ガス爆発」には該当しません。
ありがとう$
と書いた場合は、「ありがとう」で終わる行に該当します。 「ありがとうございました」には該当しません。

直前の文字の繰り返し「*」「+」「? 」

これらの3種類のメタ文字は、直前にある文字の繰り返しを表します。* が「0回以上の繰り返し」、+ が「1回以上の繰り返し」、? が「0回または1回の繰り返し」となります。少しずつ違いますので、違いを理解して使い分けてください。また、 ワイルドカードとは効果が異なりますので注意してください。具体例を見ていきましょう。

おー*い
と書いた場合、ー の0回以上の繰り返しになるので、「おい」「おーい」「おーーい」などが該当します。
おー+い
の場合、ー の1回以上の繰り返しになるので、 「おーい」「おーーい」などが該当します。「おい」は該当しません。
おー?い
の場合、ー の0回または1回の繰り返し、つまりあるかないか、ですので「おい」「おーい」は該当しますが「おーーい」は該当しません。

いずれかの文字列「| 」

文字列を | で区切った場合、その文字列のいずれかであることを表します。

Twitter|ついったー|ツイッター
と書いた場合は、「Twitter」「ついったー」「ツイッター」を含む場合に該当します。

指定した文字のどれか「[ ] 」

文字を [ ] で囲った場合は、その中のどれか1文字であることを表します。

あれは[鳥車]です
の場合、「あれは鳥です」「あれは車です」に該当しますが、 「あれは1です」は該当しません。

この表現ですが、もし「すべての半角アルファベットを指定したい」というような場合はどうすればいいでしょうか。

[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
と書くのは非常に面倒ですよね。 なので、- を使って、[A-Z]のような書き方で、範囲を指定することもできます。
[A-Z]
とした場合は、任意のアルファベット1文字を表します。
[0-9]
とした場合は、任意の数字1文字を表します。
[A-Z0-9]
とした場合、任意のアルファベット1文字か任意の数字一文字を表します。

除外

また、[ ]内の先頭で ^ を使用すると否定になり、「指定した文字ではない」ということを表します。

[^A-Z]
とした場合は、半角のアルファベットでない1文字になります。
[^0-9]
とした場合も同様に、半角の数字ではない1文字になります。

グループ化「( ) 」

( ) で文字をくくると、それをグループとし、一つの文字として扱います。

(どん)+
と書くと、「どん」をひとつの文字として扱い、その1回以上の繰り返しになりますので、「どん」「どんどん」「どんどんどん」等に該当することになります。
明日(ぼく|わたし|おれ)は出かけます
と書いた場合、()の部分が「ぼく」「わたし」「おれ」のいずれかということになり、それを一つのグループとして扱うので、「明日ぼくは出かけます」「明日わたしは出かけます」「明日おれは出かけます」に該当します。

大文字・小文字の区別

ルール作成の簡易化のため、大文字・小文字は区別しません。

応用してみる

オフの関係のキーワードを捕捉する

オフについて考えられるキーワードを | で繋いでいきます。

オフ|おふ|off

Tweenまとめサイト/Tween-dev両方の更新情報を捕捉する

普通の人にはあまり関係ないですが、例題と言うことで。

キーワードは、まとめサイト更新情報が[Twnまとめ]、dev更新情報が[TwnDev]です。 従って、これらの両方を捕捉する場合は次のようになります。

\[Twn(まとめ|dev)\]

ポイントは次の部分です。

  1. [ ]がメタ文字になるために\を前に置いて効果を打ち消す。
  2. 「まとめ」と「dev」のどちらかを表すために( )を使ってグループ化している。

ニコニコ動画とYouTubeの動画URLを捕捉する

nicovideo\.jp|youtube\.com

.はメタ文字になりますので、\を置いてメタ文字の効果を打ち消す必要があることに注意してください。 URL短縮されているものはどうするの?と思う人もいると思いますが、振り分けルールで「リンク先URLも検索する」にチェックをしておくと、短縮URLを展開した結果の文字列も検索対象になりますので、これでOKです。

特定の文字列を除いたキーワードを補足したい

あるキーワードを補足対象にしたい、しかしフッタなどに含まれている場合は除外したい。このような場合でも正規表現で処理できてしまいます。

「株」をキーワードとしたいが、「(株)」は対象外としたい

(?<!\()株(?!\))

(?<!\() により、「株」の前に「(」がつかないことを、(?!\)) により「株」の後に「)」がつかないことをそれぞれ保証します。

(?<!xxxx)と(?!xxxx)は否定の文法です。今回は、xxxx部分に「(」「)」をマッチさせたいので、メタ文字効果を打ち消す\と共に「\(」「\)」をそれぞれ当てはめました。 除外ルールの指定ができるようになりましたので、マッチルールに「株」を、除外ルールに「(株)」を指定することでも実現できます。

「Tween」を対象とするが、「Tweenクラス」は除外したい

(TweenクラスはFlash製作で使われるライブラリでTwitterクライアントのTweenとは無関係です。)

Tween(?!クラス)
(?!クラス) により、Tweenのあとに「クラス」が続かないことを保証します。 除外ルールの指定ができるようになりましたので、マッチルールに「Tween」を、除外ルールに「Tweenクラス」を指定することでも実現できます。

軽く説明してみましたが、うまく使えばとても便利なものです。今まで知らなかったという人は是非試してみてください。

謝辞とリンク

次のサイトの記述を参考にさせていただきました。ありがとうございます。

こちらのWebページでいろいろなパターンの動作確認ができます。ただしすべてのメタ文字をサポートしているわけではないようです。 .NET 正規表現チェックツール

正規表現をテストできるツールを作成しました。 見ればわかると思うので使い方の解説は特に行いません。

ここからはエキスパート向け

Tweenで使える正規表現は、.NET Framework 2.0のクラスライブラリにあるSystem.Text.RegularExpressionsで使える正規表現そのものです。 完全な仕様についてはこちらを参照してください。

.NET Frameworkの正規表現

  • RegEx.IsMatch()する際にIgnoreCaseフラグを設定しています。よって大文字小文字を区別しません。
  • 他のRegExOptionsについては設定していません。
  • 検索対象は本文の他、tinyurl.comで圧縮済みのURLを展開したもの、@返信のURLも含みます。ただし、振り分けルール作成時に「リンク先URLも検索する」にチェックしている場合のみです。このチェックが無効の場合はURLを検索対象に含みません。
  • 単一条件で振り分けルールを作成した場合は、ID文字列と書き込み内容の両方に対して正規表現検索を試みます。
  • 行頭、行末を示す次の正規表現についての適用範囲は次の通りです。
単一条件複合条件 ID文字列複合条件 書き込み内容
^(行頭)ID文字列の先頭と書き込み内容の先頭の両方ID文字列の先頭書き込み内容の先頭
$(行末)ID文字列の末尾と書き込み内容の末尾の両方ID文字列の末尾書き込み内容の末尾