ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

正規表現 キャプチャ

今回は正規表現のキャプチャを試す。

目次


正規表現でマッチした文字列を後から参照する

特殊変数とキャプチャ

Ruby正規表現はパターンとマッチした文字列を特殊変数に保存している。
正規表現とマッチした部分は特殊変数を使って後から参照することができる。
( )で囲むことでパターンを部分的に取り込むことができる。これを「キャプチャ」という。
リファレンスマニュアルは次のとおり。

Rubyリファレンスマニュアル
正規表現 キャプチャ
https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html

HTMLソースコードの概略

HTMLは< > </>のようなタグで情報を囲むことが特徴。

メタタグ<meta charset="UTF-8">に文字エンコーディングが書かれている。

<body> </body>で囲まれた範囲がブラウザに表示されるコンテンツ。

<table> </table>で囲まれた部分は表組み。

実際のHTMLコードにはCSSというプログラミング言語のコードもまざる。

キャプチャを使ったコード

HTMLタグやCSSコードを使って正規表現パターンをつくり情報を抜き取る。
コードを書く。

test.rb

html = "<li>男子シングルスカル</li>"

/<li>(.+)<\/li>/ =~ html

p $1


実行結果

"男子シングルスカル"


コードの説明。

  • HTMLコードを変数に代入する
  • 正規表現<li> </li>で囲まれた文字をパターン化する
    • ( )部分がキャプチャ
    • =~メソッドでマッチする位置を取得する
    • マッチした部分は自動で特殊変数に代入されている
  • 特殊変数$1を表示する


実行結果から<li> </li>タグの中身だけ抜き取れているのがわかる。
$1は1つ目にマッチしたパターンという意味。
複数マッチしている場合は$につづく数字が2、3、4...という具合に増えていく。

キャプチャにタグをつける

キャプチャには(?< >パターン)の形でタグをつけることができる。
コードを書いてみる。

html = "<li>男子シングルスカル</li>"

/<li>(?<event>.+)<\/li>/ =~ html

p event

#実行結果
#=> "男子シングルスカル" 


上の例では( )にeventという名前のタグをつけている。
タグをつけるとタグ名で呼び出すことができる。

scanメソッド

scanは文字列オブジェクトのインスタンスメソッド。
scanメソッドは引数の配列をつくる。
引数には正規表現もつかえる。
リファレンスマニュアルは次のとおり。

Rubyリファレンスマニュアル Stringクラス
インスタンスメソッド scan
https://docs.ruby-lang.org/ja/latest/class/String.html

コードを書く。

test.rb

html2 = <<HTML
  <h1>男子シングルスカル</h1>
      <div>組別:予選A組</div>
  <h1>男子シングルスカル</h1>
      <div>組別:予選B組</div>
  <h1>男子シングルスカル</h1>
      <div>組別:予選C組</div>
HTML

p html2.scan(/<div>組別:(.+)<\/div>/)


実行結果

[["予選A組"], ["予選B組"], ["予選C組"]]


コードの説明。

  • HTMLコードを真似た文字列を変数html2に代入する
    • ヒアドキュメント(後述)を使用
  • scanメソッドを使ってデータを抜き取る
    • scanメソッドの引数に正規表現を使用
    • 抜き取りたい情報をキャプチャする
  • pメソッドで詳細を表示する


実行結果をみるとキャプチャした部分だけが配列に格納されているのがわかる。
この技術を使えば種類別に情報を収集できる。

ヒアドキュメント

ヒアドキュメントは改行のある長文を扱うときに便利な方法。
書式は次のとおり。

<<識別子
...
識別子


リファレンスマニュアルは次のとおり。

Rubyリファレンスマニュアル
リテラル ヒアドキュメント
https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html

今回の動作確認環境

Ruby 2.4.3p205

macOS 10.13.4
ターミナル

Windows10
Windows PowerShell