{"id":79915,"date":"2024-03-26T15:47:30","date_gmt":"2024-03-26T06:47:30","guid":{"rendered":"https://freelance.indieverse.co.jp/media/?p=79915"},"modified":"2025-11-01T16:34:50","modified_gmt":"2025-11-01T07:34:50","slug":"ruby-regular-expression","status":"publish","type":"post","link":"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-regular-expression","title":{"rendered":"【Ruby】正規表現完全マニュアル | 置換, 抽出, メタ文字の利用などを解説"},"content":{"rendered":"<p>この記事では、</p>\n<ul>\n<li>Rubyにおける正規表現の基本的な使い方を学びたい</li>\n<li>文字列の検索や置換など、具体的な操作例を知りたい</li>\n<li>実用的な正規表現のパターンを習得したい</li>\n<li>Rubyでの高度な正規表現のテクニックを学びたい</li>\n<li>デバッグやエラー解決のための正規表現のテスト方法を理解したい</li>\n</ul>\n<p>という悩みを抱えている向けに、</p>\n<ul>\n<li>正規表現の基本的な理解とRubyでの活用方法</li>\n<li>具体的な例を通じて実用的なパターンの学習</li>\n<li>高度な正規表現のテクニックとデバッグ方法</li>\n</ul>\n<p>について解説していきたいと思います。</p>\n<h2>正規表現とは</h2>\n<p>正規表現（Regular Expression）は、文字列の検索、置換、抽出などをする際に使用される強力なツールです。特定の「パターン」を定義することで、複雑な文字列操作を簡潔に記述できます。Rubyでは、<code>Regexp</code>クラスを用いて正規表現がサポートされています。</p>\n<p><a href=\"https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html\">Ruby 3.3 リファレンスマニュアル 正規表現</a></p>\n<p>例えば、ある文字列の中から電話番号を探す場合、正規表現を使って次のように記述できます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>text = \"お問い合わせは03-1234-5678まで\"\r\npattern = /\\d{2,4}-\\d{2,4}-\\d{4}/\r\n\r\nif text.match(pattern)\r\n   puts \"電話番号が見つかりました: #{$&amp;}\"\r\nelse\r\n   puts \"電話番号は見つかりませんでした\"\r\nend</code></pre>\n</div>\n<p>このコードは、<code>text</code>変数内の「数字が2〜4桁、ハイフン、数字が2〜4桁、ハイフン、数字が4桁」というパターンを探し、見つかればその部分を出力します。この場合の出力は「電話番号が見つかりました: 03-1234-5678」となります。</p>\n<h2>正規表現でマッチング・抽出・置換・分割</h2>\n<p>正規表現は、複雑なパターンマッチングを可能にする非常に強力なツールです。文字列の検索、抽出、または置換を行う場合に便利です。Rubyでの正規表現を用いた文字列操作には、主に以下のような方法があります。</p>\n<ol>\n<li><strong>文字列のマッチング</strong>：特定のパターンに合致するかどうか確認します。</li>\n<li><strong>文字列の抽出</strong>：特定のパターンに合致する文字列の部分を取り出します。</li>\n<li><strong>文字列の置換</strong>：特定のパターンに合致する部分を別の文字列で置き換えます。</li>\n<li><strong>文字列の分割</strong>：特定のパターンをデリミタとして利用し、文字列を分割します。</li>\n</ol>\n<p>実際のコード例を見てみましょう。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code># 文字列のマッチング\r\ntext = \"私のメールアドレスはexample@example.comです。他にもcontact@example.orgも使用しています。\"\r\nif text =~ /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z]{2,}\\b/\r\n   puts \"メールアドレスが含まれています。\"\r\nend\r\n# =&gt; メールアドレスが含まれています。\r\n\r\n# 文字列の置換\r\nnewtext = text.gsub(/[A-Za-z0-9.%+-]+@[A-Za-z0-9.-]+.[A-Z]{2,}/, '[秘密]')\r\nputs new_text\r\n# =&gt; 私のメールアドレスは[秘密]です。他にも[秘密]も使用しています。\r\n\r\n# 文字列の分割\r\nwords = text.split(/\\s+/)\r\nputs words.inspect\r\n# =&gt; [\"私のメールアドレスはexample@example.comです。他にもcontact@example.orgも使用しています。\"]</code></pre>\n</div>\n<div class=\"hcb_wrap\"></div>\n<p>この例では、メールアドレスを検索し、それを秘密として置換し、最後に空白文字で文章を語句に分割しています。正規表現を使うことで、これらの操作を簡単に実行できます。</p>\n<h2>正規表現の構文要素</h2>\n<p>正規表現を構成する要素には、様々な記号やパターンがあります。これらの要素を組み合わせることで、さまざまな文字列パターンを表現できます。主要な要素をいくつか紹介します。</p>\n<ul>\n<li><strong>メタ文字</strong>：特定の意味を持つ記号。例えば、<code>.</code>（ドット）は任意の一文字にマッチします。</li>\n<li><strong>キャラクタークラス</strong>：<code>[ ]</code>内に指定された任意の一文字にマッチ。例えば、<code>[abc]</code>は<code>a</code>、<code>b</code>、または<code>c</code>のいずれか一文字にマッチします。</li>\n<li><strong>量指定子</strong>：前にある文字の出現回数を指定。例えば、<code>a*</code>は<code>a</code>が0回以上の任意の回数繰り返す部分にマッチします。</li>\n<li><strong>キャプチャグループ</strong>：<code>( )</code>で囲まれた部分は、マッチした部分を記憶します。これにより、後からその部分を再利用できます。</li>\n</ul>\n<p>それでは、これらの要素を組み合わせたサンプルコードを見てみましょう。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code># メタ文字とキャラクタークラスの使用例\r\ntext = \"The quick brown fox jumps over the lazy dog.\"\r\nputs text.scan(/q[ui]ck/) # =&gt; [\"quick\"]\r\n\r\n# 量指定子の使用例\r\nputs text.scan(/o*/).inspect\r\n# =&gt; [\"\", \"\", \"\", \"\", \"o\", \"\", \"\", \"o\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"o\", \"\", \"o\", \"\", \"\", \"\"]\r\n\r\n# キャプチャグループの使用例\r\nif text =~ /The (quick) (brown) fox/\r\n   puts \"1st group: #{$1}, 2nd group: #{$2}\" # =&gt; 1st group: quick, 2nd group: brown\r\nend</code></pre>\n</div>\n<div class=\"hcb_wrap\"></div>\n<p>このサンプルでは、さまざまな正規表現の構文要素を用いて、特定のパターンの検索、量指定子を用いたマッチング、キャプチャグループによる部分抽出を行っています。これらの基本的な要素を理解することで、正規表現の応用範囲が広がります。</p>\n<h2>正規表現の具体的使用例</h2>\n<p>Rubyでの正規表現を利用した具体的な使用例を見てみましょう。ここでは、文字列の抽出、置換、そして分割の3つの操作を例に挙げます。</p>\n<h3>文字列の抽出：<code><br />\n</code></h3>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>email_text = \"お問い合わせはcontact@example.comまでお願いします。\"\r\nemail_pattern = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z]{2,}/\r\nemail_matches = email_text.scan(email_pattern)\r\nputs email_matches.inspect # =&gt; [\"contact@example.com\"]<span style=\"background-color: #ffffff; color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 16px;\"></span></code></pre>\n</div>\n<p>この例では、メールアドレスにマッチする正規表現パターンを用いて、文字列からメールアドレスを抽出しています。</p>\n<h3>文字列の置換：<code><br />\n</code></h3>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>masked_text = email_text.gsub(email_pattern, '[メールアドレス]')\r\nputs masked_text # =&gt; \"お問い合わせは[メールアドレス]までお願いします。\"</code></pre>\n</div>\n<p>ここでは、メールアドレスにマッチする部分を<code>[メールアドレス]</code>で置き換えています。このようにして、情報を隠す操作が可能です。</p>\n<h3>文字列の分割：<code><br />\n</code></h3>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>sentence = \"これは、サンプル、テキストです。\"\r\nwords = sentence.split(/、/)\r\nputs words.inspect # =&gt; [\"これは\", \"サンプル\", \"テキストです。\"]<span style=\"background-color: #ffffff; color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 16px;\"></span></code></pre>\n</div>\n<p>上記の例では、カンマ「、」をデリミタとして文字列を分割しています。こうすることで、文を単語もしくはフレーズに分割することが可能です。</p>\n<p>これらの操作は、日々のプログラミングにおいて非常に便利です。正規表現を理解し、上手に扱うことで、文字列処理の幅が大きく広がります。</p>\n<h2>メタ文字とその使い方</h2>\n<p>メタ文字は正規表現で特別な意味を持つ文字で、文字列内の特定のパターンを表現するのに使います。以下に主なメタ文字とその使い方を示します。</p>\n<ul>\n<li><code>.</code>（ドット）: 任意の一文字とマッチします（改行文字を除く）。</li>\n<li><code>^</code>: 文字列の開始を表します。</li>\n<li><code>$</code>: 文字列の終了を表します。</li>\n<li><code>*</code>: 直前の文字が0回以上繰り返される部分とマッチします。</li>\n<li><code>+</code>: 直前の文字が1回以上繰り返される部分とマッチします。</li>\n<li><code>?</code>: 直前の文字が0回または1回存在する部分とマッチします。</li>\n<li><code>[...]</code>: 指定されたどれか一文字とマッチします。例えば、<code>[abc]</code>は<code>a</code>、<code>b</code>、または<code>c</code>とマッチします。</li>\n</ul>\n<p>例えば、<code>.*</code>は任意の文字列にマッチし、<code>^abc</code>は「abc」で始まる文字列にマッチします。このようにメタ文字を使って、さまざまなパターンを簡単に表現できます。</p>\n<p>サンプルコード：</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>text = \"Hello, world!\"\r\n# 文字列の始まりにマッチ\r\nputs \"Match!\" if text =~ /^Hello/\r\n# 文字列の始まりにマッチ\r\nputs \"Match!\" if text =~ /world!$/\r\n# 任意の文字が0回以上繰り返される部分にマッチ\r\nputs text.scan(/l*/).inspect # =&gt; [\"\", \"\", \"ll\", \"\", \"\", \"\", \"\", \"l\", \"\", \"\", \"\", \"\"]</code></pre>\n</div>\n<p>このサンプルコードは、メタ文字を使って特定のパターンにマッチさせる方法を示しています。正規表現のメタ文字をうまく使いこなすことで、文字列操作の効率を大いに上げることができます。</p>\n<h2>キャプチャとグループ化の技術</h2>\n<p>キャプチャとグループ化は、正規表現を使用してより高度な文字列操作を行う際に非常に役立つ技術です。これらを使用することで、マッチした部分を後で参照したり、複数のパターンの組み合わせにマッチする複雑な条件を指定できます。</p>\n<h3>キャプチャ：</h3>\n<p>キャプチャは、正規表現にマッチした部分文字列を記憶し、後で参照できるようにする機能です。キャプチャは<code>()</code>で囲むことで作成できます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>text = \"名前: 山田太郎, 年齢: 30, 職業: エンジニア\"\r\npattern = /名前: (\\w+), 年齢: (\\d+), 職業: (\\w+)/\r\n\r\nif text =~ pattern\r\n   puts \"名前: #{$1}, 年齢: #{$2}, 職業: #{$3}\"\r\nend\r\n</code></pre>\n</div>\n<p>このコードでは、<code>(\\w+)</code>、<code>(\\d+)</code>、<code>(\\w+)</code>がキャプチャを用いてそれぞれ名前、年齢、職業をグループ化しています。マッチ後、<code>$1</code>、<code>$2</code>、<code>$3</code>によってキャプチャした部分が参照されています。</p>\n<h3>グループ化：</h3>\n<p>グループ化は、複数の表現をまとめて一つの単位として扱い、そのグループ全体に量指定子を適用するなどの処理を行うために使用します。グループ化も<code>()</code>を使用しますが、キャプチャとは異なり、単にパターンの一部をまとめるために使用されます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>text = \"aaabbbccc\"\r\npattern = /(a{3})(b{3})(c{3})/\r\n\r\nif text =~ pattern\r\n   puts \"Matched: aの部分: #{$1}, bの部分: #{$2}, cの部分: #{$3}\"\r\nend</code></pre>\n</div>\n<p>このコードでは、<code>a{3}</code>、<code>b{3}</code>、<code>c{3}</code>がグループ化してあり、それぞれ3回連続する<code>a</code>、<code>b</code>、<code>c</code>にマッチします。キャプチャを使って各グループのマッチする文字列を後で参照しています。</p>\n<p>キャプチャとグループ化は非常に強力な技術であり、複雑な文字列操作を可能にします。これらを理解し適切に使用することで、Rubyの正規表現をより効果的に活用することができます。</p>\n<h2>RubyのRegexpクラスを使う</h2>\n<h3>Regexpクラスの基本</h3>\n<p>Rubyにおける正規表現の操作は主に<code>Regexp</code>クラスを通じて行われます。このクラスは、正規表現オブジェクトを作成し、文字列に対する様々な操作（マッチング、検索、置換等）を提供します。<code>Regexp</code>オブジェクトは<code>/.../</code>や<code>Regexp.new</code>を使用して作成することができます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code># /.../を使用してRegexpオブジェクトを作成\r\nregexp = /[0-9]+/\r\n# Regexp.newを使用してRegexpオブジェクトを作成\r\nregexp = Regexp.new('[0-9]+')\r\ntext = \"今日は2023年4月15日です。\"\r\nif text.match(regexp)\r\n   puts \"数字が含まれています。\"\r\nend</code></pre>\n</div>\n<p>このサンプルでは、数字にマッチする正規表現パターンを使用しています。<code>match</code>メソッドを用いて文字列がこのパターンにマッチするかどうかを検証しています。</p>\n<h3>パターンマッチングの実例</h3>\n<p>Ruby 2.7以降では、パターンマッチングのための構文が導入されました。これにより、<code>Regexp</code>オブジェクトを活用したより直感的なパターンマッチングが可能になります。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>text = \"user@example.com\"\r\ncase text\r\nin /(.+)@(.+)/\r\n   localpart, domain = $1, $2\r\n   puts \"ローカル部分: #{localpart}, ドメイン: #{domain}\"\r\nelse\r\n   puts \"マッチしませんでした。\"\r\nend</code></pre>\n</div>\n<p>この例では、メールアドレスのローカル部分とドメインを抽出するためのパターンマッチングを行っています。<code>case/in</code>構文を用いることで、マッチした結果を直接変数に割り当てることができ、非常に便利です。</p>\n<p><code>Regexp</code>クラスとRubyのパターンマッチング構文を使いこなすことで、文字列に関する複雑な条件も簡単に処理できるようになります。正規表珀の知識と組み合わせることで、Rubyにおける強力な文字列操作が可能になります。</p>\n<h2>高度な正規表現のテクニック</h2>\n<h3>繰り返しと量指定子</h3>\n<p>正規表現における繰り返しと量指定子は、特定の文字やパターンが何回繰り返されるかを指定するために使用される重要な要素です。これらを上手く使用することで、非常に柔軟な文字列パターンを定義できます。</p>\n<p>以下は、繰り返しと量指定子の基本的な使い方を示す例です。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>text = \"aabbccddddeeeeffff\"\r\n# \"d\"が4回繰り返されるパターン\r\nputs text.scan(/d{4}/).inspect # =&gt; [\"dddd\"]\r\n# 3回以上繰り返される\"e\"\r\nputs text.scan(/e{3,}/).inspect # =&gt; [\"eeee\"]\r\n# 1回以上繰り返される\"c\"、ゼロかそれ以上の\"b\"\r\nputs text.scan(/c+b*/).inspect # =&gt; [\"cc\", \"b\"]</code></pre>\n</div>\n<p>ここでは、<code>{n}</code>、<code>{n,}</code>、<code>{n,m}</code>という量指定子を使用しています。これらはそれぞれ、文字がn回、n回以上、n回からm回繰り返されることを意味します。また、<code>+</code>は1回以上の繰り返しを、<code>*</code>は0回以上の繰り返しを表します。</p>\n<h3>アンカーと文字クラスの活用</h3>\n<p>アンカーとは、文字列の特定の位置（例えば、文字列の始まりや終わり）を指定するために使用される正規表現の要素です。文字クラスは、特定の文字の集合から任意の一文字にマッチするために使用されます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code># アンカーの使用例\r\ntext = \"This is a test.\"\r\nputs \"マッチしました\" if text =~ /^This/ # 文字列の始まりにマッチ\r\nputs \"マッチしました\" if text =~ /test.$/ # 文字列の終わりにマッチ\r\ntext = \"phone: 123-456-7890\"\r\nputs text.scan(/[0-9]/).join # 数字のみを抽出 =&gt; \"1234567890\"</code></pre>\n</div>\n<p>この例では、<code>^</code>アンカーを使って文字列の始まりにマッチするパターンを、<code>$</code>アンカーを使って文字列の終わりにマッチするパターンを定義しています。また、<code>[0-9]</code>という文字クラスを使用して数字にマッチするパターンを記述しています。</p>\n<h3>条件分岐とオプション設定</h3>\n<p>正規表現における条件分岐は、一つのパターンの中で複数の選択肢から一つにマッチさせるために使用されます。また、オプション設定を利用すると、大文字小文字の区別の有無など、正規表現の挙動を細かく制御できます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>text = \"Color or colour?\"\r\n# 条件分岐の使用例\r\nputs \"マッチしました\" if text =~ /colou?r/ # \"color\"または\"colour\"にマッチ\r\n# オプション設定の使用例(iオプションで大文字小文字を区別しない)\r\nputs \"マッチしました\" if text =~ /COLOR/i # 大文字小文字を区別せずにマッチ</code></pre>\n</div>\n<p>ここでは、<code>?</code>を使用して0回または1回の繰り返し（条件分岐）を表し、<code>i</code>オプションを使用して大文字小文字の区別無しにマッチさせるパターンを定義しています。</p>\n<p>これらの高度なテクニックをマスターすることで、Rubyにおける正規表現をかなり強力に活用することができます。正規表現は非常に複雑な処理も可能にするため、習得することでプログラミングの幅が広がります。</p>\n","protected":false},"excerpt":{"rendered":"<p>Rubyの正規表現を基礎から実践まで網羅。検索・抽出・置換・分割、メタ文字や量指定子、キャプチャ、実用パターン、テストとデバッグ手法をサンプルコードで解説します。初心者から上級者まで役立ちます。</p>\n","protected":false},"author":105,"featured_media":54391,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[190],"tags":[286],"class_list":["post-79915","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ruby","tag-ruby"],"aioseo_notices":[],"meta_description":"Rubyの正規表現を基礎から実践まで網羅。検索・抽出・置換・分割、メタ文字や量指定子、キャプチャ、実用パターン、テストとデバッグ手法をサンプルコードで解説します...","_links":{"self":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/79915","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts"}],"about":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/types/post"}],"author":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/users/105"}],"replies":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/comments?post=79915"}],"version-history":[{"count":3,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/79915/revisions"}],"predecessor-version":[{"id":93450,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/79915/revisions/93450"}],"wp:featuredmedia":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/media/54391"}],"wp:attachment":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/media?parent=79915"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/categories?post=79915"},{"taxonomy":"post_tag","embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/tags?post=79915"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}