正規表現(2) 検索パターン

Perl正規表現検索パターンを記述するには、前後を「m/」と「/」で囲みます。「m」は省略できます。

m/Windows (3\.1|95|98|NT|Me|2000|XP|2003|Vista)/  # m// 各種Windowsを検索
/Windows (3\.1|95|98|NT|Me|2000|XP|2003|Vista)/   # 上と同じ意味 

文字列に正規表現を適用するには、以下のように「=~」という演算子を使います。文字列に「m//」(正規表現検索パターン)を適用すると、文字列の中からパターンを検索する事ができます。
文字列に検索パターンがマッチした場合(文字列が検索パターンを含んでいた場合)真が返され、マッチしなかった場合は偽が返されます。

use strict;
my $text = "The first OS I used was Windows 95.";
if ($text =~ m/Windows (3\.1|95|98|NT|Me|2000|XP|2003|Vista)/) {
	print "Windows OS is in the text.\n";
} else {
	print "Windows OS is not in the text.\n";
}

「=~」演算子を使わずに正規表現パターンだけ書いた場合は、「$_」が対象になります。以下のコードは上のものと同じ意味です。

use strict;
$_ = "The first OS I used was Windows 95.";
if (/Windows (3\.1|95|98|NT|Me|2000|XP|2003|Vista)/) {
	print "Windows OS is in the text.\n";
} else {
	print "Windows OS is not in the text.\n";
}

実行結果です。

Windows OS is in the text.

ちゃんと検索できています。

試しに $text を変えてみると……

use strict;
my $text = "The first OS I used was Linux";
if ($text =~ m/Windows (3\.1|95|98|NT|Me|2000|XP|2003|Vista)/) {
	print "Windows OS is in the text.\n";
} else {
	print "Windows OS is not in the text.\n";
}
Windows OS is not in the text.

と、ちゃんと「ありません」と表示されます。(^_^)

ちなみに、「m」を付けている場合は正規表現を囲う「/」(スラッシュ)を、他の文字に変えられます。開きカッコ({[(< など)を開始の文字に使うと、対応した閉じカッコが終わりの文字になります。(q や qq などと同じです)

m|Perl Monger|
m{Palmo}
m(Regular Expression)

今日はここまで。明日からどしどし正規表現を使ってみます。
正規表現は使いこなせばとても便利なので、もし知らなかったら、ぜひぜひ勉強してみてくださいね。(^_^)

正規表現(1) 基礎知識

Perl正規表現を勉強します。実のところ、僕は既に正規表現を他の言語で勉強したので、知っています。(^_^) でも、基礎知識を復習します。

正規表現」(regular expression)とは、文字列の中に「パターン」を見出して、文字列処理を抽象化できる、とても便利な機能です。主に文字列の中からサブ文字列を検索する時や、サブ文字列を別の文字列へ置換する時に使われます。エディタの検索機能としてよく見かける事ができます。
例えば

The first OS I used was Windows 95. But, I wasn't patient enough to keep using it. So I switched to Windows 98 as soon as released by Microsoft. Via Windows 2000, I'm eventually using Windows XP now, and I've been looking forward to Windows Vista.

という英文があったとして、この文に出てくる「Windows」を調べて、以下のように出力したいとします。

Windows 95
Windows 98
Windows 2000
Windows XP
Windows Vista

こんな時、普通の検索と文字列処理で済ませようとすると、まず「Windows」を検索して、その次の単語を substr (文字列の一部を取得する関数)などで切り出して、有効な OS かどうか調べて……と大変です。
正規表現を使って以下のように書くと、この検索が簡単にできます。

Windows (3\.1|95|98|NT|Me|2000|XP|2003|Vista)

これは「Windows 」の後ろに「3.1」「95」「98」「NT」「Me」「2000」「XP」「2003」「Vista」のどれかがある所にマッチします(検索がひっかかります)。つまり「Windows 95」や「Windows XP」など、上に挙げたバージョンの物を全て一度に検索できてしまうわけです。

この例は、正規表現の便利さの一つの側面でしかありません。正規表現には様々な機能があり、それを網羅的に説明していると本が1冊書けてしまいます。(^_^;)
ぱるも日記では、正規表現自体の基本的な文法や機能については習得済みとして先を続けます。ただ、Perl スクリプト中に正規表現を使う場合、なるべく説明したいと思います。

以下、正規表現を勉強する際のウェブサイトなど。(正規表現には色々と方言がありますので、注意が必要です)

perldoc perlretut
(日本語訳) Perl正規表現チュートリアル。基礎の文法を勉強できます。:
perldoc perlreref
(日本語訳) Perl正規表現のリファレンス。早く調べたい時に。:
正規表現メモ - Perlで使用できる正規表現演算子
Perl で使える正規表現演算子の一覧。:
Rieu ちゃんの正規表現講座
正規表現を基礎を解説しています。:
Perl正規表現雑技
正規表現の応用。「正規表現不定方程式を解く」など面白いです。:

正規表現を解説している書籍だと、やはりオライリーの「詳説 正規表現」が定番のようですが、僕は持っていませんので、あまり無責任な事は書けません。(>_<;)

詳説 正規表現 第2版

詳説 正規表現 第2版

(もしオススメのウェブサイト・書籍があればゼヒ教えてください♪)