文字列のマッチングと置換のためのRuby正規表現
レギュラーマッチング
Rubyといえば、もちろん正規表現の仕組みにも触れなければならない。正規表現は、文字列の検証やマッチングからWeb抽出まで、さまざまな領域で強力なマッチング言語として使われるようになってきている。正規表現によるマッチングの効率性を批判する声もあるが、正規表現の威力を考えれば問題ないだろう。
Rubyの正規表現は、Rubyの=~とmatchを抜きにしては語れません。そこで、この2種類のマッチングの違いを例で説明しましょう。まず、=~の使い方について。
message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
puts regex=~message
message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
puts regex=~message
Rubyでは、正規表現のマッチング文を表すのに、//が使われます。これを実行すると、上の文は両側に小文字のついた3つの数字の文字列にマッチします。なぜ結果が10になるのか、不思議に思うだろう。これが =~ の美点で、マッチした最初の出現箇所を出力するのです。
では、matchを見てみましょう。
message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
puts regex.match(message)
message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
puts regex.match(message)
出力を見てみましょう。f414jは、ルールにマッチするすべての正規文の集合を表す文字列です。お気づきかどうかわかりませんが、正規表現では括弧を使用しており、その中から3桁の数字を抜き出したいと思います。もちろん、これも非常に簡単で、上のコードを少し変更するだけでいい。
message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
regex.match(message)
puts $1
message="afhadhffkdf414j"
regex=/[a-z](\d{3})[a-z]/
regex.match(message)
puts $1
結果は当然414です。なぜ$0でなく$1を使うのか?0の場合はどうなるのか見てみましょう。
C:/Users/Administrator/Documents/NetBeansProjects/RubyApplication1/lib/regex.rb
このオブジェクトの出力情報である。
ここで新しい状況を紹介します。文字列の中にたくさんのマッチがある場合はどうでしょう。上の文は最初に見つかった結果にのみマッチし、すべての結果を表示する必要があります。最初はjavaの影響を受けて、matchの結果は集合になると思っていたので、全体をどうするかは考えていませんでした。そこで見つけたのがscanメソッドです。そのコードを以下に示す。
message="afhadhffkdf414j9tr3j43i3433094jwoert223jwew123dfdf"
regex=/[a-z](\d{3})[a-z]/
message.scan(regex).each{|m|puts"Theresultis#{m[0]}"}
message="afhadhffkdf414j9tr3j43i3433094jwoert223jwew123dfdf"
regex=/[a-z](\d{3})[a-z]/
message.scan(regex).each{|m|puts"Theresultis#{m[0]}"}
端的に言えば、その結果です。
Theresultis414
Theresultis223
Theresultis123
Theresultis414
Theresultis223
Theresultis123
どうです、便利でしょう。マッチしたものをすべて抽出するのは簡単です。
正規表現のグループ化
正規表現をグループ化し、マッチングに成功した後にグループ化した値を$1,$2,$3,$4に格納することができる ......................。
print $1,"\n",$2 if "a1b2c3d4e5" =~ /(\w{2})(\w*)/
文字列の定期的な置き換え。
print "abcd".sub(/\w/,"9")
print "\n"
print "abcd".gsub(/\w/,"9")
レギュラーで特殊なグローバル変数。
- $1,$2,$3 .... グループ化されたマッチングテキスト
- $` 前のテキストに一致させる
- $' はテキストの後にあるテキストにマッチします
print <pre name="code" class="ruby">,"\n",{1},"\n",
if "ab9cd" =~ /\d/
関連
-
redisクラスタ構築のチュートリアルと発生した問題
-
RVMを使ってRuby/Railsのバージョン切り替えを制御する
-
bundlerを使ったRuby環境のインストールと複数バージョンのgemの管理
-
Luhnアルゴリズムの学習とそのRuby実装コード例
-
MongoDBに接続するためのRuby on Railsフレームワークアプリケーション チュートリアル
-
Ruby on RailsのWebプロジェクト構築のためのシンプルガイド
-
RubyがWeb画像クローリングを実装
-
デザインパターンのうち、ProxyパターンとDecorativeパターンを使ったRubyのコード例
-
Ruby on Railsのjquery_ujsコンポーネントが遅くなる問題が解決された
-
Rubyの変数参照に関するいくつかの注意点
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Rubyを使ったFTPパスワードクラッキング
-
挿入ソートアルゴリズムのRuby実装と高度な双方向挿入ソートコード例
-
Rubyにおけるフックメソッドとメソッド呼び出しへのフックの追加例
-
win10でvirtualbox+vagrantでrubyの開発マシン環境を構築する
-
RubyのHash構造体の基本操作のまとめ
-
Rubyのデザインパターン。アダプタパターン実践ガイド
-
Ruby on RailsでPing ++プラットフォームでの決済を実現
-
Ruby on RailsにおけるCucumberの活用を解説します。
-
Rubyにおける正規表現の使用に関する分析
-
Rubyでコレクションを書くためのガイド