--/--/-- (--)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2008/06/01 (日)
ぜひマスターしておきたい正規表現。


grepコマンドで文字列を検索するときとかテキストエディタで置換するときとか、正規表現を使いこなせると便利だしカッコイイ。
または、Linuxに英和辞書とかを入れていると自由自在に単語を検索できる。

例えば次の問題がわかりますか?

問題
先頭以外に文字列abcを含む文字列を検索(メタキャラクタで表現)しなさい

どうでしょうか。
正規表現というものを熟知していると解けるかもしれません。

そもそも正規表現とは何なのか。
正規表現とは、いくつかの文字列を一つの文字列で表現する方法のことです。
例えば、英単語の「切る:cut」と「猫:cat」は真ん中の文字uとaが違うだけです。
これを一つの文字列で表現しようとするのが正規表現です。
例えば「^c.t$」という感じで表せますす。
ここ出てきた「^」とか「.」「$」がメタキャラクタです。
ここで、注意してほしいのはメタキャラクタはシングルクォーテーション「'」で囲まないと正しく認識しいない場合もあります。上の例だと「'^'c'.'t'$'」という感じです。
下の例では囲んでいないので適宜補完してください。

メタキャラクタには次のようなものがあります。
\m メタキャラクタの意味ではなく、その文字自身
つまり、メタキャラクタを単なる文字として認識させたいときに使う
^ 行の先頭
$ 行の末尾
. 任意の1文字
[abc] 文字abcのいずれか1文字
[a-c] 文字abcのいずれか1文字
[^abc] 文字abc以外の任意の1文字

他にもいろいろなメタキャラクタがありますが、興味があったら調べてみてください。
それではまず先ほどの問題の解説の前に簡単なのを一つ。


問題
文字列abcを含む文字列を検索しなさい
簡単ですね。答えは
「abc」
です。文字列検索コマンドのgrepと合わせれば
# grep abc
という感じ。
これを踏まえてさっきの問題。


問題
先頭以外に文字列abcを含む文字列を検索しなさい
答えは、
「.abc」
です。
別解として
「^.*abc」
なんてのも考えられます。おもしろいですね。
grepのオプションと組み合わせれば
「grep -v ^a | grep abc」
というのもあり。
「-v」は指定された文字列を含まないようにするオプションです。
もう一つ考えてみましょう。


問題
ちょうど10文字で構成される文字列を検索しなさい
答えは
「^..........$」
です。
よくある間違えとして「..........」がありますが、これは10文字以上の意味になります。
「^」と「$」で挟んででやらないといけません。
別解として
「^[a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]$」
なんてのもありかもしれません。
ただし、意味は違います。「.」は任意の1文字であるためアルファベットの大文字や数字・記号も含まれます。一方「a-z」は小文字のアルファベットのみです。
問題ではそこまで厳密に書いていませんが状況に応じて使い分けるといいでしょう。


問題
文字列abcではじまって文字列cbaで終わる文字列を検索しなさい
これは実は2つgrepを組み合わせないと難しい。答えは
「grep ^abc | grep cba$」
です。
「^abc.*cba$」で正解な気がしますが、これだけでは「abcba」という文字列が対象から除外されます。
そこまで厳密になる必要なんかないですけどね。


コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事へのトラックバック
この記事のトラックバックURL
http://tochiii.blog119.fc2.com/tb.php/88-3d29da77
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。