joppot

コピペで絶対動く。説明を妥協しない

unix プログラミング

正規表現を極めるその2

投稿日:2014年2月18日 更新日:

Pocket

faw

概要

みなさんこんにちはcandleです。今回は前回に引き続き、正規表現を勉強していきましょう。

 

前提

unixを使用するので、多少、unixコマンドになれていること

 

サンプル文章

今回は下の文章を用いて、正規表現の勉強を行います。

1642年12月25日(旧暦)イギリスリンカーンシャー州ウールスソープの農家に生まれる。
父は生まれる3ヶ月前に死去、母は2年後に再婚し、その後は祖母に育てられる。神童であったらしい。
1661年(18歳)ケンブリッジにあるトリニティカレッジに入学。3年生の頃から独自の学問、研究を始める。
1665年(22歳)二項定理、微分を発見、後に微分積分学へと発 展。この年に万有引力の法則などを発見し、驚異の年と呼ばれる。
1669年(26歳)ケンブリッジ大学のルーカス数学教授に就任する。この頃反射望遠鏡を発明し、後に王立協会の会員に選出される。
1687年(44歳)「自然哲学の数学的原理(プリンキピア)」を刊行。
1699年(56歳)教え子の縁で造幣局長官に就任。偽金づくりの摘発やお札のデザインなどで手腕を発揮し、死ぬまで職を続ける。
1703年(60歳)王立協会会長に就任。この職も死ぬまで続ける
1727年(85歳)3月20日、発作により85年の生涯を閉じる。

出典:http://www.geocities.jp/nkkagosu50/page146.html

これをn.txtという名前でデスクトップにでも保存してください。

n_txt

ターミナルを開いてデスクトップに移動します。

デスクトップ_—_bash

準備ができました。

 

「[ ]」は文字群のどれか1文字をマッチする

これは[ ]の中に1234567890と書いたりして、その中のどれか一文字にマッチさせたります。

例えば、サンプルコードに対して検索をかけてみましょう。1700年の情報だいけを検索したい時は

grep "17[1234567890][1234567890]" n.txt

と検索すれば、「17○○」に該当する文章がマッチします。

デスクトップ_—_bash-3


「[0-9][a-z][A-Z]」は数字、アルファベットの省略

先ほど0から9までの数字どれか1つと一致させる時、下の様に書きました。

[1234567890]

これの省略系が

[0-9]

です。これは0から9までの文字という意味になり、0〜9の数字いずれか1文字とマッチします。

同様に英字も

[a-z]

とすれば、アルファベットのaからzまでのいずれか1文字にマッチする様になります。

先ほどの検索を短縮系を使って検索してみましょう。

grep "17[0-9][0-9]" n.txt

デスクトップ_—_bash-3 2
同じ結果がでたでしょ。


ひらがな、漢字、カタカナも省略系もある

数字、1文字を[0-9]を用いて簡単に検索できました。

この省略系は日本語にも対応しています。

いずれかの漢字1文字と一致させるには

[亜-熙]

ひらがなは

[ぁ-ん]

です。「ぁ」が小文字の「ぁ」になっている事に気をつけてください。

カタカナは

[ァ-ン]

です。同じ様に、「ァ」が小文字の「ァ」になっている事に気をつけてください。

では試しに、いづれかの「[数字][数字][漢字]」という検索をしてみましょう。
これに一致するのは「27年」とか「30日」とかになります。

grep “[0-9][0-9][亜-熙]” n.txt

どうでしょうか。
デスクトップ_—_bash-3 3

うまくいかない場合は次の問題があります。

ただし、日本語の場合はunixの文字コードとファイルの文字エンコーディングが一致していないと、うまくいかないようです。

例えば、macターミナルの文字コードがUTF-8でファイルがShift-JISだと、検索しても出てきません。

デスクトップ_—_bash_と_n_txt-12

この場合はファイルをUTF-8にそろえて、grepしてあげましょう。


「[^]」は指定した文字、1文字の否定

さきほど、[0-9]というのは0から9までのどれかという意味でしたが、[^0-9]とすると、0から9以外の何か1文字といういみになります。

例えば、「1700年」意外の年、のデータを取得したい場合は

grep “1[^7][0-9[0-9]年” n.txt

ということになります。

デスクトップ_—_bash-3 4


「( )」は文字をグールプ化する

前回説明したように、grepでは論理式の「OR」を表すのに縦棒を使いますが、縦棒の前には\バックスラッシュがつきます。

\|

同じ様に、unixのgrepでは小括弧( )の前にバックスラッシュがつきます。

\(グループ化したい文字\)

という風に書きます。

文字をグループ化するとは、例えば、「数字1つと年、月、日、歳のどれか」をマッチさせたい時に、使用します。

grep "[0-9]]\(年\|月\|日\|歳\)" n.txt

数字とその後に年月日歳のいずれかがついた文字が表示されると思います。

デスクトップ_—_bash-3 5


今回のまとめ

今回は正規表現で重要となる括弧の使い方を見てきました。これと、前回のを足し合わせるだけで、6割の検索はできるようになります。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-unix, プログラミング
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

macでreact nativeの環境構築をして、iosアプリのhello worldをする

概要 みなさんこんにちはcandleです。 今回は、react nativeの環境構築をmac上で行い、iosアプリでhello worldをしてみたいと思います。 react nativeはreac …

phpmyadminでmysqlデータベースの照合順序を変更する

概要 みなさんこんにちはcandleです。 ちょっとした事なのですが、意外に分からなかったのでまとめました。 phpmyadminを使ってデータベースを作ると、うっかり、utf8_general_ci …

mysqlのデータベース、テーブル、データをmysqldumpを使用してバックアップする

概要 みなさんこんにちはcandleです。今回はmysqlのデータベースのバックアップを様々試します。 データベースのバックアップと言っても、テーブルのみとか構造のみとか、様々なオプションがあります。 …

railsのscaffoldでremote formで送信後jsonを取得する

概要 みなさんこんにちはcandleです。 今回はrailsのformをremoteを使ってajaxした時に、 サーバに送った値をjavascript側で受け取る方法を紹介します。 ちなみに、私は下の …

Rails pluginを使ったgemの作り方[2](rails組み込み編)

概要 みなさんこんにちはcandleです。前回に引き続き、gemの作成をやっていきましょう。 今回はgemを作成したら、それをrailsプロジェクト上で読み込み、動作テストをするところをやります。 前 …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ