{"id":1554,"date":"2025-03-24T08:50:25","date_gmt":"2025-03-23T23:50:25","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=1554"},"modified":"2025-03-24T08:50:25","modified_gmt":"2025-03-23T23:50:25","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91ruby%e3%82%a8%e3%83%b3%e3%82%b8%e3%83%8b%e3%82%a2%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e6%ad%a3%e8%a6%8f%e8%a1%a8%e7%8f%be%e5%ae%8c%e5%85%a8%e3%83%9e","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=1554","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Ruby\u30a8\u30f3\u30b8\u30cb\u30a2\u306e\u305f\u3081\u306e\u6b63\u898f\u8868\u73fe\u5b8c\u5168\u30de\u30b9\u30bf\u30fc\u8b1b\u5ea72024\uff1a\u5b9f\u8df5\u7684\u306a7\u3064\u306e\u4f7f\u3044\u65b9"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Ruby\u306b\u304a\u3051\u308b\u6b63\u898f\u8868\u73fe\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">Ruby\u306e\u6b63\u898f\u8868\u73fe\u30ea\u30c6\u30e9\u30eb\u3068\u57fa\u672c\u69cb\u6587\u3092\u7406\u89e3\u3057\u3088\u3046<\/a>      <\/li>      <li>        <a href=\"#i-2\">match\u30e1\u30bd\u30c3\u30c9\u3068match?\u30e1\u30bd\u30c3\u30c9\u306e\u9055\u3044\u3068\u4f7f\u3044\u5206\u3051<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">\u30ad\u30e3\u30d7\u30c1\u30e3\u3068\u30b0\u30eb\u30fc\u30d7\u5316\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u306e\u4f5c\u6210\u65b9\u6cd5\u3068\u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u4f8b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">\u6587\u5b57\u5217\u306e\u691c\u7d22\u3068\u7f6e\u63db\u3092\u78ba\u5b9f\u306b\u884c\u3046\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li>        <a href=\"#i-6\">\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u65e5\u4ed8\u3068\u6642\u523b\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u8003\u616e\u3057\u305f\u6b63\u898f\u8868\u73fe\u306e\u5b9f\u88c5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u6b63\u898f\u8868\u73fe\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u3068\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u3092\u9632\u3050\u52b9\u7387\u7684\u306a\u30d1\u30bf\u30fc\u30f3\u8a2d\u8a08<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">\u5927\u91cf\u30c7\u30fc\u30bf\u51e6\u7406\u6642\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">\u30bb\u30ad\u30e5\u30a2\u306a\u6b63\u898f\u8868\u73fe\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">\u6b63\u898f\u8868\u73fe\u306b\u3088\u308bDoS\u653b\u6483\u306e\u5bfe\u7b56\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-14\">\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u5024\u306e\u5b89\u5168\u306a\u691c\u8a3c\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30db\u30fc\u30eb\u3092\u4f5c\u3089\u306a\u3044\u305f\u3081\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-16\">\u30c1\u30fc\u30e0\u958b\u767a\u306e\u305f\u3081\u306e\u6b63\u898f\u8868\u73fe\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">\u53ef\u8aad\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u547d\u540d\u898f\u5247\u3068\u30b3\u30e1\u30f3\u30c8\u8853<\/a>      <\/li>      <li>        <a href=\"#i-18\">\u30c6\u30b9\u30c8\u5bb9\u6613\u6027\u3092\u8003\u616e\u3057\u305f\u30d1\u30bf\u30fc\u30f3\u5206\u5272\u624b\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u3067\u6307\u6458\u3055\u308c\u3084\u3059\u3044\u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f3<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-20\">\u5b9f\u52d9\u3067\u3088\u304f\u4f7f\u3046\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u96c6<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">\u30ed\u30b0\u89e3\u6790\u3067\u4f7f\u3048\u308b\u4fbf\u5229\u306a\u6b63\u898f\u8868\u73fe<\/a>      <\/li>      <li>        <a href=\"#i-22\">\u30c7\u30fc\u30bf\u30af\u30ec\u30f3\u30b8\u30f3\u30b0\u306b\u4f7f\u3048\u308b\u6b63\u898f\u8868\u73fe<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-23\">CSV\u30d1\u30fc\u30b9\u51e6\u7406\u3067\u4f7f\u3048\u308b\u6b63\u898f\u8868\u73fe<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-24\">\u6b63\u898f\u8868\u73fe\u306e\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-25\">\u6b63\u898f\u8868\u73fe\u30c7\u30d0\u30c3\u30ac\u30fc\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-26\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-27\">\u30d1\u30bf\u30fc\u30f3\u306e\u6bb5\u968e\u7684\u306a\u6539\u5584\u624b\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-28\">\u6b63\u898f\u8868\u73fe\u306e\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-29\">\u6b63\u898f\u8868\u73fe\u30c7\u30d0\u30c3\u30ac\u30fc\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-30\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-31\">\u30d1\u30bf\u30fc\u30f3\u306e\u6bb5\u968e\u7684\u306a\u6539\u5584\u624b\u6cd5<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Ruby\u306b\u304a\u3051\u308b\u6b63\u898f\u8868\u73fe\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">Ruby\u306e\u6b63\u898f\u8868\u73fe\u30ea\u30c6\u30e9\u30eb\u3068\u57fa\u672c\u69cb\u6587\u3092\u7406\u89e3\u3057\u3088\u3046<\/h3>\n\n\n\n<p>Ruby\u3067\u306f\u3001\u6b63\u898f\u8868\u73fe\u3092<code>\/\/<\/code>\uff08\u30b9\u30e9\u30c3\u30b7\u30e5\uff09\u3067\u56f2\u3080\u3053\u3068\u3067\u8868\u73fe\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u6b63\u898f\u8868\u73fe\u30ea\u30c6\u30e9\u30eb\u3068\u547c\u3070\u308c\u3001Ruby\u306e\u7279\u5fb4\u7684\u306a\u69cb\u6587\u306e\u4e00\u3064\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306a\u6b63\u898f\u8868\u73fe\u306e\u4f5c\u6210\u65b9\u6cd5\npattern = \/ruby\/  # 'ruby'\u3068\u3044\u3046\u6587\u5b57\u5217\u306b\u30de\u30c3\u30c1\u3059\u308b\npattern = %r{ruby}  # \u5225\u306e\u66f8\u304d\u65b9\uff08\u30c7\u30ea\u30df\u30bf\u306b{}\u3092\u4f7f\u7528\uff09\npattern = Regexp.new('ruby')  # Regexp\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u751f\u6210\n\n# \u4fee\u98fe\u5b50\uff08\u30d5\u30e9\u30b0\uff09\u306e\u4f7f\u7528\u4f8b\n\/pattern\/i    # \u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u306a\u3044\n\/pattern\/m    # \u8907\u6570\u884c\u30e2\u30fc\u30c9\n\/pattern\/x    # \u7a7a\u767d\u3068\u30b3\u30e1\u30f3\u30c8\u3092\u7121\u8996\u3059\u308b\u62e1\u5f35\u69cb\u6587<\/pre>\n\n\n\n<p>\u4e3b\u8981\u306a\u30e1\u30bf\u6587\u5b57\u3068\u7279\u6b8a\u6587\u5b57\u30af\u30e9\u30b9\uff1a<\/p>\n\n\n<div id=\"id-f26d8869-2042-443b-8955-fc94ceb9c30c\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30e1\u30bf\u6587\u5b57<\/th><th>\u8aac\u660e<\/th><th>\u4f7f\u7528\u4f8b<\/th><\/tr><\/thead><tbody><tr><td><code>.<\/code><\/td><td>\u4efb\u610f\u306e1\u6587\u5b57<\/td><td><code>\/.at\/<\/code> \u2192 \u201ccat\u201d, \u201chat\u201d \u306a\u3069<\/td><\/tr><tr><td><code>\\w<\/code><\/td><td>\u82f1\u6570\u5b57\u3068\u30a2\u30f3\u30c0\u30fc\u30b9\u30b3\u30a2<\/td><td><code>\/\\w+\/<\/code> \u2192 \u5358\u8a9e\u306b\u30de\u30c3\u30c1<\/td><\/tr><tr><td><code>\\d<\/code><\/td><td>\u6570\u5b57<\/td><td><code>\/\\d{3}\/<\/code> \u2192 3\u6841\u306e\u6570\u5b57<\/td><\/tr><tr><td><code>\\s<\/code><\/td><td>\u7a7a\u767d\u6587\u5b57<\/td><td><code>\/\\s+\/<\/code> \u2192 1\u3064\u4ee5\u4e0a\u306e\u7a7a\u767d<\/td><\/tr><tr><td><code>^<\/code><\/td><td>\u884c\u982d<\/td><td><code>\/^Ruby\/<\/code> \u2192 \u884c\u982d\u306e\u201dRuby\u201d<\/td><\/tr><tr><td><code>$<\/code><\/td><td>\u884c\u672b<\/td><td><code>\/end$\/<\/code> \u2192 \u884c\u672b\u306e\u201dend\u201d<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">match\u30e1\u30bd\u30c3\u30c9\u3068match?\u30e1\u30bd\u30c3\u30c9\u306e\u9055\u3044\u3068\u4f7f\u3044\u5206\u3051<\/h3>\n\n\n\n<p><code>match<\/code>\u30e1\u30bd\u30c3\u30c9\u3068<code>match?<\/code>\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u4f3c\u3066\u3044\u308b\u3088\u3046\u3067\u7570\u306a\u308b\u7279\u5fb4\u3092\u6301\u3063\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># match\u30e1\u30bd\u30c3\u30c9\uff1aMatchData\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u8fd4\u3059\ntext = \"Hello, Ruby!\"\nresult = text.match(\/Ruby\/)\nputs result.class      # =&gt; MatchData\nputs result[0]         # =&gt; \"Ruby\"\nputs result.pre_match  # =&gt; \"Hello, \"\n\n# match?\u30e1\u30bd\u30c3\u30c9\uff1a\u771f\u507d\u5024\u306e\u307f\u3092\u8fd4\u3059\uff08\u9ad8\u901f\uff09\ntext = \"Hello, Ruby!\"\nresult = text.match?(\/Ruby\/)  # =&gt; true<\/pre>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6bd4\u8f03\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'benchmark'\n\ntext = \"Hello, Ruby!\" * 1000\npattern = \/Ruby\/\n\nBenchmark.bm do |x|\n  x.report(\"match:\") { 1000.times { text.match(pattern) } }\n  x.report(\"match?:\") { 1000.times { text.match?(pattern) } }\nend\n\n# \u5b9f\u884c\u7d50\u679c\u4f8b\uff1a\n#       user     system      total        real\n# match:  0.123456  0.000000  0.123456 (  0.123456)\n# match?: 0.023456  0.000000  0.023456 (  0.023456)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u30ad\u30e3\u30d7\u30c1\u30e3\u3068\u30b0\u30eb\u30fc\u30d7\u5316\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30ad\u30e3\u30d7\u30c1\u30e3\u30b0\u30eb\u30fc\u30d7\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30de\u30c3\u30c1\u3057\u305f\u90e8\u5206\u3092\u5f8c\u3067\u53c2\u7167\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306a\u30ad\u30e3\u30d7\u30c1\u30e3\u306e\u4f7f\u7528\ntext = \"2024-03-15\"\nif match = text.match(\/(\\d{4})-(\\d{2})-(\\d{2})\/)\n  year = match[1]   # =&gt; \"2024\"\n  month = match[2]  # =&gt; \"03\"\n  day = match[3]    # =&gt; \"15\"\nend\n\n# \u540d\u524d\u4ed8\u304d\u30ad\u30e3\u30d7\u30c1\u30e3\u306e\u4f7f\u7528\uff08\u53ef\u8aad\u6027\u304c\u5411\u4e0a\uff09\ndate_pattern = \/(?&lt;year&gt;\\d{4})-(?&lt;month&gt;\\d{2})-(?&lt;day&gt;\\d{2})\/\nif match = text.match(date_pattern)\n  year = match[:year]   # =&gt; \"2024\"\n  month = match[:month] # =&gt; \"03\"\n  day = match[:day]     # =&gt; \"15\"\nend\n\n# \u5f8c\u65b9\u53c2\u7167\u306e\u4f7f\u7528\u4f8b\uff08HTML \u30bf\u30b0\u306e\u30de\u30c3\u30c1\u30f3\u30b0\uff09\nhtml = \"&lt;h1&gt;Title&lt;\/h1&gt;\"\nhtml.match(\/&lt;(\\w+)&gt;.*?&lt;\\\/\\1&gt;\/)  # \\1 \u306f\u6700\u521d\u306e\u30ad\u30e3\u30d7\u30c1\u30e3\u30b0\u30eb\u30fc\u30d7\u3092\u53c2\u7167<\/pre>\n\n\n\n<p>\u30b0\u30eb\u30fc\u30d7\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u53ef\u8aad\u6027\u3092\u91cd\u8996\u3057\u3001\u540d\u524d\u4ed8\u304d\u30ad\u30e3\u30d7\u30c1\u30e3\u3092\u4f7f\u7528\u3059\u308b<\/li>\n\n\n\n<li>\u5fc5\u8981\u306e\u306a\u3044\u90e8\u5206\u306f\u975e\u30ad\u30e3\u30d7\u30c1\u30e3\u30b0\u30eb\u30fc\u30d7 <code>(?:...)<\/code> \u3092\u4f7f\u7528<\/li>\n\n\n\n<li>\u8907\u96d1\u306a\u30d1\u30bf\u30fc\u30f3\u306f\u5c0f\u3055\u306a\u90e8\u5206\u306b\u5206\u5272\u3059\u308b<\/li>\n\n\n\n<li>\u30b3\u30e1\u30f3\u30c8\u3092\u9069\u5207\u306b\u4ed8\u4e0e\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u790e\u7684\u306a\u77e5\u8b58\u3092\u62bc\u3055\u3048\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u6b63\u898f\u8868\u73fe\u306e\u5b9f\u88c5\u306b\u9032\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u57fa\u790e\u3092\u6d3b\u304b\u3057\u305f\u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u4f8b\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u306e\u4f5c\u6210\u65b9\u6cd5\u3068\u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u4f8b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u6587\u5b57\u5217\u306e\u691c\u7d22\u3068\u7f6e\u63db\u3092\u78ba\u5b9f\u306b\u884c\u3046\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u6587\u5b57\u5217\u306e\u691c\u7d22\u3068\u7f6e\u63db\u306f\u3001\u6b63\u898f\u8868\u73fe\u306e\u6700\u3082\u57fa\u672c\u7684\u304b\u3064\u91cd\u8981\u306a\u4f7f\u7528\u4f8b\u3067\u3059\u3002Ruby\u3067\u306f\u3001\u69d8\u3005\u306a\u30e1\u30bd\u30c3\u30c9\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u67d4\u8edf\u306a\u6587\u5b57\u5217\u51e6\u7406\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306a\u6587\u5b57\u5217\u691c\u7d22\ntext = \"The quick brown fox jumps over the lazy dog\"\n\n# scan\u30e1\u30bd\u30c3\u30c9\u3067\u5168\u3066\u306e\u30de\u30c3\u30c1\u3092\u914d\u5217\u3068\u3057\u3066\u53d6\u5f97\nwords = text.scan(\/\\w+\/)  # =&gt; [\"The\", \"quick\", \"brown\", \"fox\", ...]\n\n# gsub\u30e1\u30bd\u30c3\u30c9\u3067\u4e00\u62ec\u7f6e\u63db\ncensored = text.gsub(\/fox|dog\/, '*' * 3)  # =&gt; \"The quick brown *** jumps over the lazy ***\"\n\n# \u6761\u4ef6\u4ed8\u304d\u7f6e\u63db\uff08\u30d6\u30ed\u30c3\u30af\u4f7f\u7528\uff09\nprocessed = text.gsub(\/\\w+\/) do |match|\n  match.length &gt; 4 ? match.upcase : match\nend\n# =&gt; \"The QUICK BROWN fox JUMPS over the LAZY dog\"\n\n# \u6587\u5b57\u5217\u306e\u6b63\u898f\u5316\u4f8b\uff08\u5168\u89d2\u6570\u5b57\u3092\u534a\u89d2\u306b\u5909\u63db\uff09\ndef normalize_numbers(text)\n  conversion = {\n    '\uff10' =&gt; '0', '\uff11' =&gt; '1', '\uff12' =&gt; '2', '\uff13' =&gt; '3', '\uff14' =&gt; '4',\n    '\uff15' =&gt; '5', '\uff16' =&gt; '6', '\uff17' =&gt; '7', '\uff18' =&gt; '8', '\uff19' =&gt; '9'\n  }\n  text.gsub(\/[\uff10-\uff19]\/, conversion)\nend\n\nnormalized = normalize_numbers(\"\u4fa1\u683c\uff1a\uff11\uff12\uff13\uff14\uff15\u5186\")  # =&gt; \"\u4fa1\u683c\uff1a12345\u5186\"<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5<\/h3>\n\n\n\n<p>\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306f\u3001Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u3088\u304f\u4f7f\u7528\u3055\u308c\u308b\u6a5f\u80fd\u3067\u3059\u3002\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u5b9f\u88c5\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class UserValidator\n  # \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u691c\u8a3c\n  # RFC 5322\u306b\u6e96\u62e0\u3057\u305f\u7c21\u7565\u7248\u30d1\u30bf\u30fc\u30f3\n  EMAIL_PATTERN = \/\\A[a-zA-Z0-9.!#$%&amp;'*+\\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\\z\/\n\n  # \u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u8981\u4ef6\n  # - 8\u6587\u5b57\u4ee5\u4e0a\n  # - \u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u5927\u6587\u5b57\n  # - \u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u5c0f\u6587\u5b57\n  # - \u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u6570\u5b57\n  # - \u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u7279\u6b8a\u6587\u5b57\n  PASSWORD_PATTERN = \/\\A\n    (?=.*[A-Z])        # \u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u5927\u6587\u5b57\n    (?=.*[a-z])        # \u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u5c0f\u6587\u5b57\n    (?=.*\\d)           # \u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u6570\u5b57\n    (?=.*[!@#$%^&amp;*])  # \u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u7279\u6b8a\u6587\u5b57\n    .{8,}              # \u5168\u4f53\u30678\u6587\u5b57\u4ee5\u4e0a\n  \\z\/x\n\n  def validate_email(email)\n    return false if email.nil? || email.empty?\n    return false if email.length &gt; 254  # \u6700\u5927\u9577\u30c1\u30a7\u30c3\u30af\n\n    email.match?(EMAIL_PATTERN)\n  end\n\n  def validate_password(password)\n    return false if password.nil? || password.empty?\n    return false if password.length &gt; 72  # bcrypt\u306e\u5236\u9650\u3092\u8003\u616e\n\n    password.match?(PASSWORD_PATTERN)\n  end\nend\n\n# \u4f7f\u7528\u4f8b\nvalidator = UserValidator.new\nputs validator.validate_email(\"user@example.com\")     # =&gt; true\nputs validator.validate_email(\"invalid.email\")        # =&gt; false\nputs validator.validate_password(\"Password1!\")        # =&gt; true\nputs validator.validate_password(\"weakpass\")          # =&gt; false<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u65e5\u4ed8\u3068\u6642\u523b\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u65e5\u4ed8\u3068\u6642\u523b\u306e\u51e6\u7406\u306f\u3001\u591a\u304f\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u5fc5\u8981\u3068\u3055\u308c\u308b\u6a5f\u80fd\u3067\u3059\u3002\u6b63\u898f\u8868\u73fe\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u67d4\u8edf\u306a\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u51e6\u7406\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class DateTimeParser\n  # \u69d8\u3005\u306a\u65e5\u4ed8\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306b\u5bfe\u5fdc\u3059\u308b\u30d1\u30bf\u30fc\u30f3\n  DATE_PATTERNS = {\n    iso8601: \/\\A(\\d{4})-(\\d{2})-(\\d{2})\\z\/,\n    jp_date: \/\\A(\\d{4})\u5e74(\\d{1,2})\u6708(\\d{1,2})\u65e5\\z\/,\n    slash_date: \/\\A(\\d{4})\\\/(\\d{1,2})\\\/(\\d{1,2})\\z\/\n  }\n\n  # \u6642\u523b\u306e\u30d1\u30bf\u30fc\u30f3\uff0824\u6642\u9593\u5f62\u5f0f\u306812\u6642\u9593\u5f62\u5f0f\uff09\n  TIME_PATTERNS = {\n    hour24: \/\\A(\\d{2}):(\\d{2})(?::(\\d{2}))?\\z\/,\n    hour12: \/\\A(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(AM|PM)\\z\/i\n  }\n\n  def parse_date(date_str)\n    DATE_PATTERNS.each do |format, pattern|\n      if match = date_str.match(pattern)\n        year = match[1].to_i\n        month = match[2].to_i\n        day = match[3].to_i\n        return Date.new(year, month, day) if valid_date?(year, month, day)\n      end\n    end\n    raise ArgumentError, \"Invalid date format: #{date_str}\"\n  end\n\n  def parse_time(time_str)\n    TIME_PATTERNS.each do |format, pattern|\n      if match = time_str.match(pattern)\n        hours = match[1].to_i\n        minutes = match[2].to_i\n        seconds = match[3]&amp;.to_i || 0\n\n        if format == :hour12\n          hours = normalize_12hour(hours, match[4].upcase == 'PM')\n        end\n\n        return Time.new(2000, 1, 1, hours, minutes, seconds)\n      end\n    end\n    raise ArgumentError, \"Invalid time format: #{time_str}\"\n  end\n\n  private\n\n  def valid_date?(year, month, day)\n    Date.valid_date?(year, month, day)\n  end\n\n  def normalize_12hour(hours, is_pm)\n    return 0 if hours == 12 &amp;&amp; !is_pm\n    return 12 if hours == 12 &amp;&amp; is_pm\n    return hours + 12 if is_pm\n    hours\n  end\nend\n\n# \u4f7f\u7528\u4f8b\nparser = DateTimeParser.new\n\n# \u65e5\u4ed8\u306e\u30d1\u30fc\u30b9\nputs parser.parse_date(\"2024-03-15\")      # =&gt; 2024-03-15\nputs parser.parse_date(\"2024\u5e743\u670815\u65e5\")    # =&gt; 2024-03-15\nputs parser.parse_date(\"2024\/3\/15\")       # =&gt; 2024-03-15\n\n# \u6642\u523b\u306e\u30d1\u30fc\u30b9\nputs parser.parse_time(\"14:30\")           # =&gt; 2000-01-01 14:30:00\nputs parser.parse_time(\"2:30 PM\")         # =&gt; 2000-01-01 14:30:00\nputs parser.parse_time(\"14:30:45\")        # =&gt; 2000-01-01 14:30:45<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u5b9f\u52d9\u3067\u983b\u7e41\u306b\u5fc5\u8981\u3068\u306a\u308b\u51e6\u7406\u306e\u30d9\u30fc\u30b9\u3068\u3057\u3066\u6d3b\u7528\u3067\u304d\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8981\u4ef6\u3084\u30d3\u30b8\u30cd\u30b9\u30eb\u30fc\u30eb\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u3092\u3088\u308a\u52b9\u7387\u7684\u306b\u5b9f\u88c5\u3059\u308b\u305f\u3081\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u8003\u616e\u3057\u305f\u6b63\u898f\u8868\u73fe\u306e\u5b9f\u88c5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u6b63\u898f\u8868\u73fe\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u3068\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528\u6cd5<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u306f\u8a08\u7b97\u30b3\u30b9\u30c8\u306e\u9ad8\u3044\u51e6\u7406\u3067\u3059\u3002\u7279\u306b\u30eb\u30fc\u30d7\u5185\u3067\u540c\u3058\u30d1\u30bf\u30fc\u30f3\u3092\u7e70\u308a\u8fd4\u3057\u4f7f\u7528\u3059\u308b\u5834\u5408\u3001\u30d1\u30bf\u30fc\u30f3\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3059\u308b\u3053\u3068\u3067\u5927\u5e45\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6539\u5584\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u60aa\u3044\u4f8b\uff1a\u30eb\u30fc\u30d7\u5185\u3067\u6b63\u898f\u8868\u73fe\u3092\u6bce\u56de\u751f\u6210\ndef validate_emails_slow(emails)\n  emails.select do |email|\n    email.match?(\/\\A[\\w+\\-.]+@[a-z\\d\\-]+(\\.[a-z\\d\\-]+)*\\.[a-z]+\\z\/i)\n  end\nend\n\n# \u826f\u3044\u4f8b\uff1a\u6b63\u898f\u8868\u73fe\u3092\u5b9a\u6570\u3068\u3057\u3066\u4e8b\u524d\u306b\u30b3\u30f3\u30d1\u30a4\u30eb\nclass EmailValidator\n  EMAIL_REGEX = \/\\A[\\w+\\-.]+@[a-z\\d\\-]+(\\.[a-z\\d\\-]+)*\\.[a-z]+\\z\/i\n\n  def self.validate_emails(emails)\n    emails.select { |email| email.match?(EMAIL_REGEX) }\n  end\nend\n\n# \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6bd4\u8f03\nrequire 'benchmark'\n\nemails = Array.new(10000) { \"user#{_1}@example.com\" }\n\nBenchmark.bm do |x|\n  x.report('Without cache:') { validate_emails_slow(emails) }\n  x.report('With cache:   ') { EmailValidator.validate_emails(emails) }\nend\n\n# \u5b9f\u884c\u7d50\u679c\u4f8b\uff1a\n#                    user     system      total        real\n# Without cache:   0.180000   0.000000   0.180000 (  0.182353)\n# With cache:      0.040000   0.000000   0.040000 (  0.041234)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u3092\u9632\u3050\u52b9\u7387\u7684\u306a\u30d1\u30bf\u30fc\u30f3\u8a2d\u8a08<\/h3>\n\n\n\n<p>\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u306f\u6b63\u898f\u8868\u73fe\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u4f4e\u4e0b\u3055\u305b\u308b\u4e3b\u8981\u306a\u8981\u56e0\u3067\u3059\u3002\u9069\u5207\u306a\u30d1\u30bf\u30fc\u30f3\u8a2d\u8a08\u306b\u3088\u308a\u3001\u3053\u308c\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PatternOptimizer\n  # \u60aa\u3044\u4f8b\uff1a\u904e\u5270\u306a\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u304c\u767a\u751f\n  BAD_PATTERN = \/^.*end$\/\n\n  # \u826f\u3044\u4f8b\uff1a\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u3092\u6700\u5c0f\u5316\n  GOOD_PATTERN = \/^[^\u00a5n]*end$\/\n\n  # \u3055\u3089\u306b\u826f\u3044\u4f8b\uff1a\u5426\u5b9a\u5148\u8aad\u307f\u3092\u4f7f\u7528\n  BETTER_PATTERN = \/^(?!.*\u00a5n).*end$\/\n\n  def self.demonstrate_backtracking\n    # \u9577\u3044\u30c6\u30ad\u30b9\u30c8\u3092\u751f\u6210\n    text = 'a' * 10000 + 'end'\n\n    Benchmark.bm do |x|\n      x.report('Bad pattern:   ') { text.match?(BAD_PATTERN) }\n      x.report('Good pattern:  ') { text.match?(GOOD_PATTERN) }\n      x.report('Better pattern:') { text.match?(BETTER_PATTERN) }\n    end\n  end\nend\n\n# \u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u9632\u6b62\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\nclass OptimizedRegex\n  # 1. \u56fa\u5b9a\u6587\u5b57\u5217\u304b\u3089\u59cb\u3081\u308b\n  URL_PATTERN = \/\\Ahttps?:\\\/\\\/[^\\s&lt;&gt;\"]+\\z\/\n\n  # 2. \u9069\u5207\u306a\u91cf\u6307\u5b9a\u5b50\u3092\u4f7f\u7528\n  WHITESPACE_PATTERN = \/[^\\S\\r\\n]{2,4}\/\n\n  # 3. \u975e\u8caa\u6b32\u30de\u30c3\u30c1\u30f3\u30b0\u306e\u9069\u5207\u306a\u4f7f\u7528\n  HTML_TAG_PATTERN = \/&lt;[^&gt;]+&gt;\/\n\n  # 4. \u30a2\u30c8\u30df\u30c3\u30af\u30b0\u30eb\u30fc\u30d7\u306e\u6d3b\u7528\n  ATOMIC_PATTERN = \/\u00a5A(?&gt;[a-z]+)\u00a5d+\u00a5z\/i\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u5927\u91cf\u30c7\u30fc\u30bf\u51e6\u7406\u6642\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u5927\u91cf\u306e\u30c7\u30fc\u30bf\u3092\u51e6\u7406\u3059\u308b\u969b\u306f\u3001\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u4e21\u65b9\u3092\u8003\u616e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class LargeFileProcessor\n  def self.process_log_file(file_path)\n    pattern = \/^(\\d{4}-\\d{2}-\\d{2}) (\\d{2}:\\d{2}:\\d{2}) \\[(\\w+)\\] (.*)$\/\n\n    # 1. \u30d5\u30a1\u30a4\u30eb\u30921\u884c\u305a\u3064\u51e6\u7406\n    File.open(file_path).each_line.lazy\n        .select { |line| line.match?(pattern) }\n        .map { |line| line.match(pattern) }\n        .each_slice(1000) do |matches|\n      # \u30d0\u30c3\u30c1\u51e6\u7406\u3092\u5b9f\u88c5\n      process_batch(matches)\n    end\n  end\n\n  def self.process_batch(matches)\n    matches.each do |match|\n      date, time, level, message = match.captures\n      # \u51e6\u7406\u3092\u5b9f\u88c5\n    end\n  end\n\n  # \u4e26\u5217\u51e6\u7406\u3092\u6d3b\u7528\u3057\u305f\u4f8b\n  def self.parallel_process_files(file_paths)\n    require 'parallel'\n\n    Parallel.each(file_paths, in_processes: 4) do |file_path|\n      process_log_file(file_path)\n    end\n  end\nend\n\n# \u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u5b9f\u88c5\u4f8b\nclass StreamProcessor\n  def self.process_stream(io)\n    buffer = \"\"\n    pattern = \/\u00a5w+\/\n\n    io.each_char do |char|\n      buffer &lt;&lt; char\n\n      if buffer.match?(pattern)\n        yield buffer\n        buffer = \"\"\n      end\n    end\n\n    yield buffer unless buffer.empty?\n  end\nend<\/pre>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u306e\u4e8b\u524d\u30b3\u30f3\u30d1\u30a4\u30eb<\/li>\n\n\n\n<li>\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u306e\u6700\u5c0f\u5316<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u8003\u616e<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u9078\u629e<\/li>\n\n\n\n<li>\u4e26\u5217\u51e6\u7406\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u6b63\u898f\u8868\u73fe\u3092\u4f7f\u7528\u3057\u305f\u51e6\u7406\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5927\u5e45\u306b\u6539\u5584\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u9762\u3067\u306e\u8003\u616e\u4e8b\u9805\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">\u30bb\u30ad\u30e5\u30a2\u306a\u6b63\u898f\u8868\u73fe\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u6b63\u898f\u8868\u73fe\u306b\u3088\u308bDoS\u653b\u6483\u306e\u5bfe\u7b56\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u3092\u4f7f\u7528\u3059\u308b\u969b\u3001\u7279\u306b\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u3092\u51e6\u7406\u3059\u308b\u5834\u5408\u306f\u3001ReDoS\uff08Regular Expression Denial of Service\uff09\u653b\u6483\u306e\u30ea\u30b9\u30af\u306b\u6ce8\u610f\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class SecureRegexMatcher\n  # \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u4ed8\u304d\u306e\u6b63\u898f\u8868\u73fe\u30de\u30c3\u30c1\u30f3\u30b0\n  def self.match_with_timeout(text, pattern, timeout_seconds = 1)\n    # \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u5236\u5fa1\u4ed8\u304d\u3067\u5b9f\u884c\n    Timeout.timeout(timeout_seconds) do\n      text.match?(pattern)\n    end\n  rescue Timeout::Error\n    false  # \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u6642\u306f\u30de\u30c3\u30c1\u5931\u6557\u3068\u3057\u3066\u6271\u3046\n  end\n\n  # \u6587\u5b57\u5217\u9577\u5236\u9650\u4ed8\u304d\u306e\u30de\u30c3\u30c1\u30f3\u30b0\n  def self.match_with_limit(text, pattern, max_length = 1000)\n    return false if text.length &gt; max_length\n    text.match?(pattern)\n  end\n\n  # \u7d44\u307f\u5408\u308f\u305b\u305f\u5b89\u5168\u306a\u30de\u30c3\u30c1\u30f3\u30b0\n  def self.safe_match(text, pattern, options = {})\n    options = {\n      timeout: 1,\n      max_length: 1000\n    }.merge(options)\n\n    return false if text.nil?\n    return false if text.length &gt; options[:max_length]\n\n    match_with_timeout(text, pattern, options[:timeout])\n  end\nend\n\n# \u4f7f\u7528\u4f8b\nbegin\n  pattern = \/^(a+)+b$\/  # \u60aa\u610f\u306e\u3042\u308b\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\n  text = \"a\" * 100 + \"X\"  # \u60aa\u610f\u306e\u3042\u308b\u5165\u529b\n\n  # \u5b89\u5168\u306a\u30de\u30c3\u30c1\u30f3\u30b0\n  result = SecureRegexMatcher.safe_match(text, pattern)\n  puts \"Match result: #{result}\"\nrescue =&gt; e\n  puts \"Error: #{e.message}\"\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u5024\u306e\u5b89\u5168\u306a\u691c\u8a3c\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u3092\u51e6\u7406\u3059\u308b\u969b\u306f\u3001\u9069\u5207\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u30b5\u30cb\u30bf\u30a4\u30ba\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class InputValidator\n  # \u5b89\u5168\u306a\u5165\u529b\u691c\u8a3c\u30af\u30e9\u30b9\n  class &lt;&lt; self\n    def sanitize_input(input)\n      return nil if input.nil?\n\n      # \u57fa\u672c\u7684\u306a\u30b5\u30cb\u30bf\u30a4\u30ba\u51e6\u7406\n      input.to_s\n           .strip\n           .gsub(\/[\\u0000-\\u001F\\u007F-\\u009F]\/, '')  # \u5236\u5fa1\u6587\u5b57\u306e\u9664\u53bb\n           .gsub(\/[^\\w\\s@.-]\/, '')                     # \u8a31\u53ef\u3059\u308b\u6587\u5b57\u4ee5\u5916\u3092\u9664\u53bb\n    end\n\n    def validate_with_pattern(input, pattern, options = {})\n      sanitized = sanitize_input(input)\n      return false if sanitized.nil? || sanitized.empty?\n\n      # \u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u30f3\u30b0\u524d\u306e\u4e8b\u524d\u30c1\u30a7\u30c3\u30af\n      return false if sanitized.length &gt; (options[:max_length] || 255)\n      return false if sanitized.match?(\/[&lt;&gt;]\/)  # XSS\u5bfe\u7b56\u306e\u7c21\u6613\u30c1\u30a7\u30c3\u30af\n\n      # \u5b89\u5168\u306a\u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u30f3\u30b0\n      SecureRegexMatcher.safe_match(sanitized, pattern, options)\n    end\n  end\nend\n\n# \u5b9f\u88c5\u4f8b\uff1a\u5b89\u5168\u306a\u30d5\u30a9\u30fc\u30e0\u5165\u529b\u691c\u8a3c\nclass SecureFormValidator\n  EMAIL_PATTERN = \/\\A[\\w+\\-.]+@[a-z\\d\\-]+(\\.[a-z\\d\\-]+)*\\.[a-z]+\\z\/i\n  USERNAME_PATTERN = \/\\A[a-zA-Z0-9_]{4,20}\\z\/\n\n  def validate_form(params)\n    errors = []\n\n    # \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u691c\u8a3c\n    unless InputValidator.validate_with_pattern(\n      params[:email],\n      EMAIL_PATTERN,\n      max_length: 254\n    )\n      errors &lt;&lt; \"Invalid email format\"\n    end\n\n    # \u30e6\u30fc\u30b6\u30fc\u540d\u306e\u691c\u8a3c\n    unless InputValidator.validate_with_pattern(\n      params[:username],\n      USERNAME_PATTERN,\n      max_length: 20\n    )\n      errors &lt;&lt; \"Invalid username format\"\n    end\n\n    errors\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30db\u30fc\u30eb\u3092\u4f5c\u3089\u306a\u3044\u305f\u3081\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3001\u6b63\u898f\u8868\u73fe\u5b9f\u88c5\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3057\u307e\u3057\u3087\u3046\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class RegexSecurityChecker\n  def self.check_pattern(pattern)\n    results = []\n\n    # 1. \u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u306e\u30ea\u30b9\u30af\u691c\u8a3c\n    results &lt;&lt; check_backtracking(pattern)\n\n    # 2. \u30ad\u30e3\u30d7\u30c1\u30e3\u30b0\u30eb\u30fc\u30d7\u306e\u4f7f\u7528\u691c\u8a3c\n    results &lt;&lt; check_capture_groups(pattern)\n\n    # 3. \u30a2\u30f3\u30ab\u30fc\u306e\u4f7f\u7528\u691c\u8a3c\n    results &lt;&lt; check_anchors(pattern)\n\n    # 4. \u6587\u5b57\u30af\u30e9\u30b9\u306e\u691c\u8a3c\n    results &lt;&lt; check_character_classes(pattern)\n\n    results.compact\n  end\n\n  private\n\n  def self.check_backtracking(pattern)\n    risky_patterns = {\n      nested_quantifiers: \/\\(\\w+\\)\\+.*\\+\/,\n      nested_groups: \/\\(\\(\\w+\\)\\)\/,\n      unlimited_quantifiers: \/\\*|\\+\/\n    }\n\n    warnings = []\n    risky_patterns.each do |type, risky_pattern|\n      if pattern.source.match?(risky_pattern)\n        warnings &lt;&lt; \"Warning: Potential #{type} risk detected\"\n      end\n    end\n\n    warnings unless warnings.empty?\n  end\n\n  def self.check_capture_groups(pattern)\n    if pattern.source.match?(\/\\([^?:]\/)\n      \"Warning: Unnamed capture groups found. Consider using named groups\"\n    end\n  end\n\n  def self.check_anchors(pattern)\n    unless pattern.source.match?(\/\\A|\\z\/)\n      \"Warning: Pattern lacks string anchors\"\n    end\n  end\n\n  def self.check_character_classes(pattern)\n    if pattern.source.match?(\/\\[.+?\\]\/)\n      \"Warning: Verify character class contents\"\n    end\n  end\nend<\/pre>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u306e\u5b9f\u88c5\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5165\u529b\u5024\u306e\u691c\u8a3c<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6587\u5b57\u5217\u9577\u306e\u5236\u9650<\/li>\n\n\n\n<li>\u8a31\u53ef\u3059\u308b\u6587\u5b57\u30bb\u30c3\u30c8\u306e\u660e\u78ba\u306a\u5b9a\u7fa9<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30b5\u30cb\u30bf\u30a4\u30ba\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5b9f\u884c\u6642\u306e\u4fdd\u8b77<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u5236\u5fa1\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u5236\u9650<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30bf\u30fc\u30f3\u8a2d\u8a08<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u306e\u6700\u5c0f\u5316<\/li>\n\n\n\n<li>\u30a2\u30f3\u30ab\u30fc\u306e\u9069\u5207\u306a\u4f7f\u7528<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u91cf\u6307\u5b9a\u5b50\u306e\u4f7f\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u904b\u7528\u4e0a\u306e\u8003\u616e\u4e8b\u9805<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ed\u30b0\u51fa\u529b\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u76e3\u8996\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u30d1\u30bf\u30fc\u30f3\u898b\u76f4\u3057<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u306a\u6b63\u898f\u8868\u73fe\u51e6\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u6b63\u898f\u8868\u73fe\u306e\u6271\u3044\u65b9\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">\u30c1\u30fc\u30e0\u958b\u767a\u306e\u305f\u3081\u306e\u6b63\u898f\u8868\u73fe\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u53ef\u8aad\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u547d\u540d\u898f\u5247\u3068\u30b3\u30e1\u30f3\u30c8\u8853<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u306f\u8907\u96d1\u306b\u306a\u308a\u304c\u3061\u306a\u305f\u3081\u3001\u9069\u5207\u306a\u547d\u540d\u3068\u30b3\u30e1\u30f3\u30c8\u304c\u91cd\u8981\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u30c1\u30fc\u30e0\u958b\u767a\u3067\u306e\u898f\u7d04\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module RegexPatterns\n  # \u5b9a\u6570\u540d\u306f\u76ee\u7684\u3092\u660e\u78ba\u306b\u793a\u3059\n  # \u6b63\u898f\u8868\u73fe\u306e\u5404\u90e8\u5206\u306b\u30b3\u30e1\u30f3\u30c8\u3092\u4ed8\u4e0e\n  EMAIL_PATTERN = %r{\n    \\A\n    [\\w+\\-.]+      # \u30ed\u30fc\u30ab\u30eb\u30d1\u30fc\u30c8\uff1a\u82f1\u6570\u5b57\u3001+\u3001-\u3001.\u3092\u8a31\u53ef\n    @              # @ \u30de\u30fc\u30af\n    [a-z\\d\\-.]+    # \u30c9\u30e1\u30a4\u30f3\u540d\u306e\u6700\u521d\u306e\u90e8\u5206\n    (\\.[a-z\\d\\-]+) # \u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\n    *\\.            # \u30c9\u30c3\u30c8\u3067\u533a\u5207\u3089\u308c\u305f\u8ffd\u52a0\u306e\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\n    [a-z]+         # \u30c8\u30c3\u30d7\u30ec\u30d9\u30eb\u30c9\u30e1\u30a4\u30f3\n    \\z\n  }ix\n\n  # \u30d1\u30bf\u30fc\u30f3\u3092\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3057\u3066\u518d\u5229\u7528\u6027\u3092\u9ad8\u3081\u308b\n  module Components\n    USERNAME = \/[a-zA-Z][a-zA-Z0-9_]{2,19}\/\n    DOMAIN = \/[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?\/\n  end\n\n  # \u8907\u96d1\u306a\u30d1\u30bf\u30fc\u30f3\u306f\u5206\u5272\u3057\u3066\u7d44\u307f\u7acb\u3066\u308b\n  URL_PATTERN = %r{\n    \\A\n    https?:\/\/                      # \u30d7\u30ed\u30c8\u30b3\u30eb\n    #{Components::DOMAIN}          # \u30c9\u30e1\u30a4\u30f3\u90e8\u5206\n    (?:\\.[a-z]{2,})+              # TLD\n    (?:\/[^\\s&lt;&gt;\"]*)?               # \u30d1\u30b9\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\n    \\z\n  }x\nend\n\n# \u30d1\u30bf\u30fc\u30f3\u306e\u4f7f\u7528\u4f8b\u3092\u542b\u3080\u30c9\u30ad\u30e5\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\nclass PatternDocumentation\n  # @param username [String] \u691c\u8a3c\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u540d\n  # @return [Boolean] \u691c\u8a3c\u7d50\u679c\n  # @example\n  #   valid_username?(\"john_doe\")  #=&gt; true\n  #   valid_username?(\"123user\")   #=&gt; false\n  def valid_username?(username)\n    username.match?(RegexPatterns::Components::USERNAME)\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u30c6\u30b9\u30c8\u5bb9\u6613\u6027\u3092\u8003\u616e\u3057\u305f\u30d1\u30bf\u30fc\u30f3\u5206\u5272\u624b\u6cd5<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u306e\u30c6\u30b9\u30c8\u3092\u52b9\u679c\u7684\u306b\u884c\u3046\u305f\u3081\u306b\u3001\u30d1\u30bf\u30fc\u30f3\u3092\u9069\u5207\u306b\u5206\u5272\u3057\u3001\u5404\u90e8\u5206\u3092\u500b\u5225\u306b\u30c6\u30b9\u30c8\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'minitest\/autorun'\n\nclass RegexTest &lt; Minitest::Test\n  # \u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u3092\u30b0\u30eb\u30fc\u30d7\u5316\u3057\u3066\u7ba1\u7406\n  class EmailPatternTest &lt; Minitest::Test\n    def setup\n      @pattern = RegexPatterns::EMAIL_PATTERN\n    end\n\n    def test_valid_emails\n      valid_emails = [\n        \"user@example.com\",\n        \"user.name+tag@example.co.jp\",\n        \"user-name@subdomain.example.com\"\n      ]\n\n      valid_emails.each do |email|\n        assert_match @pattern, email, \"#{email} should be valid\"\n      end\n    end\n\n    def test_invalid_emails\n      invalid_emails = [\n        \"user@\",\n        \"@example.com\",\n        \"user@.com\",\n        \"user@example\",\n        \"user space@example.com\"\n      ]\n\n      invalid_emails.each do |email|\n        refute_match @pattern, email, \"#{email} should be invalid\"\n      end\n    end\n  end\n\n  # \u30d1\u30bf\u30fc\u30f3\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u500b\u5225\u30c6\u30b9\u30c8\n  class PatternComponentsTest &lt; Minitest::Test\n    def test_username_component\n      pattern = RegexPatterns::Components::USERNAME\n\n      assert_match pattern, \"john_doe\"\n      assert_match pattern, \"Alice123\"\n      refute_match pattern, \"123user\"\n      refute_match pattern, \"_user\"\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u3067\u6307\u6458\u3055\u308c\u3084\u3059\u3044\u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f3<\/h3>\n\n\n\n<p>\u30c1\u30fc\u30e0\u3067\u306e\u6b63\u898f\u8868\u73fe\u5b9f\u88c5\u306b\u304a\u3044\u3066\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f3\u3092\u907f\u3051\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class RegexAntiPatterns\n  # \u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f31: \u30de\u30b8\u30c3\u30af\u30ca\u30f3\u30d0\u30fc\u306e\u4f7f\u7528\n  BAD_PATTERN_1 = \/\\A.{5,10}\\z\/  # \u6570\u5024\u306e\u610f\u5473\u304c\u4e0d\u660e\u78ba\n\n  # \u826f\u3044\u4f8b\uff1a\u5b9a\u6570\u3067\u610f\u56f3\u3092\u660e\u78ba\u306b\n  MIN_LENGTH = 5\n  MAX_LENGTH = 10\n  GOOD_PATTERN_1 = \/\\A.{#{MIN_LENGTH},#{MAX_LENGTH}}\\z\/\n\n  # \u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f32: \u904e\u5ea6\u306b\u8907\u96d1\u306a\u30d1\u30bf\u30fc\u30f3\n  BAD_PATTERN_2 = \/\\A(?:(?:[a-z]+:)?\\\/\\\/)?(?:(?:[^:\\n\\r]+):(?:[^@\\n\\r]+)@)?(?:(?:www\\.)?[^:\\n\\r]+)(?::\\d+)?(?:\\\/[^?\\n\\r]+)?(?:\\?[^\\n\\r]+)?\/i\n\n  # \u826f\u3044\u4f8b\uff1a\u30d1\u30bf\u30fc\u30f3\u3092\u5206\u5272\u3057\u3066\u7ba1\u7406\n  module URLComponents\n    PROTOCOL = \/(?:[a-z]+:)?\\\/\\\/\/i\n    AUTH = \/(?:[^:\\n\\r]+):(?:[^@\\n\\r]+)@\/\n    HOST = \/(?:(?:www\\.)?[^:\\n\\r]+)\/\n    PORT = \/(?::\\d+)?\/\n    PATH = \/(?:\\\/[^?\\n\\r]+)?\/\n    QUERY = \/(?:\\?[^\\n\\r]+)?\/\n  end\n\n  GOOD_PATTERN_2 = \/\\A#{URLComponents::PROTOCOL}?#{URLComponents::AUTH}?#{URLComponents::HOST}#{URLComponents::PORT}#{URLComponents::PATH}#{URLComponents::QUERY}\\z\/\n\n  # \u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f33: \u30b3\u30e1\u30f3\u30c8\u306e\u306a\u3044\u8907\u96d1\u306a\u30d1\u30bf\u30fc\u30f3\n  BAD_PATTERN_3 = \/^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$\/\n\n  # \u826f\u3044\u4f8b\uff1a\u5341\u5206\u306a\u30b3\u30e1\u30f3\u30c8\u3068\u53ef\u8aad\u6027\u306e\u9ad8\u3044\u69cb\u9020\n  GOOD_PATTERN_3 = %r{\n    ^\n    ([a-z0-9_\\.-]+)   # \u30ed\u30fc\u30ab\u30eb\u30d1\u30fc\u30c8\n    @                  # @ \u8a18\u53f7\n    ([\\da-z\\.-]+)     # \u30c9\u30e1\u30a4\u30f3\u540d\n    \\.                # \u30c9\u30c3\u30c8\n    ([a-z\\.]{2,6})    # \u30c8\u30c3\u30d7\u30ec\u30d9\u30eb\u30c9\u30e1\u30a4\u30f3\n    $\n  }x\nend<\/pre>\n\n\n\n<p>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30bf\u30fc\u30f3\u306e\u547d\u540d<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u76ee\u7684\u304c\u660e\u78ba\u304b<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u5185\u3067\u7d71\u4e00\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n\n\n\n<li>\u518d\u5229\u7528\u6027\u3092\u8003\u616e\u3057\u3066\u3044\u308b\u304b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b3\u30e1\u30f3\u30c8\u3068\u6587\u66f8\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d1\u30bf\u30fc\u30f3\u306e\u5404\u90e8\u5206\u304c\u8aac\u660e\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n\n\n\n<li>\u4f7f\u7528\u4f8b\u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n\n\n\n<li>\u5236\u7d04\u4e8b\u9805\u304c\u660e\u8a18\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c6\u30b9\u30c8<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5341\u5206\u306a\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u304c\u3042\u308b\u304b<\/li>\n\n\n\n<li>\u30a8\u30c3\u30b8\u30b1\u30fc\u30b9\u304c\u8003\u616e\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u304c\u7406\u89e3\u3057\u3084\u3059\u3044\u304b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u8981\u306a\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u304c\u306a\u3044\u304b<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af\u304c\u8003\u616e\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u91cf\u304c\u9069\u5207\u304b<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3\u306b\u5f93\u3046\u3053\u3068\u3067\u3001\u30c1\u30fc\u30e0\u3067\u306e\u6b63\u898f\u8868\u73fe\u306e\u5b9f\u88c5\u3068\u7ba1\u7406\u304c\u52b9\u7387\u7684\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u52d9\u3067\u3088\u304f\u4f7f\u7528\u3055\u308c\u308b\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">\u5b9f\u52d9\u3067\u3088\u304f\u4f7f\u3046\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u96c6<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u30ed\u30b0\u89e3\u6790\u3067\u4f7f\u3048\u308b\u4fbf\u5229\u306a\u6b63\u898f\u8868\u73fe<\/h3>\n\n\n\n<p>\u30ed\u30b0\u89e3\u6790\u306f\u5b9f\u52d9\u3067\u3088\u304f\u906d\u9047\u3059\u308b\u30bf\u30b9\u30af\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u4e00\u822c\u7684\u306a\u30ed\u30b0\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306b\u5bfe\u3059\u308b\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u3068\u89e3\u6790\u5b9f\u88c5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module LogAnalyzer\n  # \u4e00\u822c\u7684\u306a\u30ed\u30b0\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u30d1\u30bf\u30fc\u30f3\n  PATTERNS = {\n    # Apache\/Nginx\u30a2\u30af\u30bb\u30b9\u30ed\u30b0\n    access_log: \/^(\\S+) (\\S+) (\\S+) \\[([\\w:\\\/]+\\s[+\\-]\\d{4})\\] \"(\\S+) (.*?) (\\S+)\" (\\d{3}) (\\d+) \"([^\"]*)\" \"([^\"]*)\"$\/,\n\n    # Rails\u88fd\u9020\u30ed\u30b0\n    rails_log: \/^\\[(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})\\s+(\\w+)\\]\\s+(\\w+)\\s+(.*)$\/,\n\n    # JSON\u30ed\u30b0\n    json_log: \/\\{(?:[^{}]|(\"(?:[^\"\\\\]|\\\\.)*\"))*\\}\/,\n\n    # \u30a8\u30e9\u30fc\u30ed\u30b0\n    error_log: \/^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[(\\w+)\\] (.+?):\\s+(.*)$\/\n  }\n\n  class Parser\n    def self.parse_access_log(line)\n      return nil unless (match = PATTERNS[:access_log].match(line))\n\n      {\n        ip: match[1],\n        identity: match[2],\n        user: match[3],\n        timestamp: match[4],\n        method: match[5],\n        path: match[6],\n        protocol: match[7],\n        status: match[8].to_i,\n        bytes: match[9].to_i,\n        referer: match[10],\n        user_agent: match[11]\n      }\n    end\n\n    def self.parse_rails_log(line)\n      return nil unless (match = PATTERNS[:rails_log].match(line))\n\n      {\n        timestamp: match[1],\n        level: match[2],\n        component: match[3],\n        message: match[4]\n      }\n    end\n\n    # \u30ed\u30b0\u306e\u96c6\u8a08\u4f8b\n    def self.analyze_access_logs(file_path)\n      stats = { status_codes: Hash.new(0), paths: Hash.new(0) }\n\n      File.foreach(file_path) do |line|\n        if entry = parse_access_log(line)\n          stats[:status_codes][entry[:status]] += 1\n          stats[:paths][entry[:path]] += 1\n        end\n      end\n\n      stats\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u30c7\u30fc\u30bf\u30af\u30ec\u30f3\u30b8\u30f3\u30b0\u306b\u4f7f\u3048\u308b\u6b63\u898f\u8868\u73fe<\/h3>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30af\u30ec\u30f3\u30b8\u30f3\u30b0\u306f\u3001\u751f\u30c7\u30fc\u30bf\u3092\u6271\u3046\u969b\u306b\u5fc5\u8981\u4e0d\u53ef\u6b20\u306a\u51e6\u7406\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u4e00\u822c\u7684\u306a\u30af\u30ec\u30f3\u30b8\u30f3\u30b0\u30d1\u30bf\u30fc\u30f3\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module DataCleaner\n  class TextCleaner\n    PATTERNS = {\n      # \u5168\u89d2\u82f1\u6570\u5b57\u3092\u534a\u89d2\u306b\u5909\u63db\u3059\u308b\u30d1\u30bf\u30fc\u30f3\n      fullwidth_chars: \/[\uff01-\uff5e]\/,\n\n      # \u4f59\u5206\u306a\u7a7a\u767d\u3092\u524a\u9664\u3059\u308b\u30d1\u30bf\u30fc\u30f3\n      extra_spaces: \/\\s+\/,\n\n      # HTML\u30bf\u30b0\u3092\u9664\u53bb\u3059\u308b\u30d1\u30bf\u30fc\u30f3\n      html_tags: \/&lt;[^&gt;]*&gt;\/,\n\n      # \u7279\u6b8a\u6587\u5b57\u3092\u30a8\u30b9\u30b1\u30fc\u30d7\u3059\u308b\u30d1\u30bf\u30fc\u30f3\n      special_chars: \/[&amp;&lt;&gt;\"']\/,\n\n      # \u96fb\u8a71\u756a\u53f7\u3092\u6b63\u898f\u5316\u3059\u308b\u30d1\u30bf\u30fc\u30f3\n      phone_number: \/(\\d{2,4})-?(\\d{2,4})-?(\\d{4})\/\n    }\n\n    def self.normalize_text(text)\n      return \"\" if text.nil?\n\n      text.tap do |t|\n        # \u5168\u89d2\u82f1\u6570\u5b57\u3092\u534a\u89d2\u306b\u5909\u63db\n        t.gsub!(PATTERNS[:fullwidth_chars]) { |c| c.tr('\uff01-\uff5e', '!-~') }\n\n        # \u4f59\u5206\u306a\u7a7a\u767d\u3092\u5358\u4e00\u306e\u7a7a\u767d\u306b\u7f6e\u63db\n        t.gsub!(PATTERNS[:extra_spaces], ' ')\n\n        # \u524d\u5f8c\u306e\u7a7a\u767d\u3092\u524a\u9664\n        t.strip!\n      end\n    end\n\n    def self.remove_html(text)\n      text.gsub(PATTERNS[:html_tags], '')\n    end\n\n    def self.normalize_phone(phone)\n      return nil unless match = PATTERNS[:phone_number].match(phone)\n      \"#{match[1]}-#{match[2]}-#{match[3]}\"\n    end\n\n    # \u7279\u6b8a\u6587\u5b57\u306e\u30a8\u30b9\u30b1\u30fc\u30d7\n    def self.escape_special_chars(text)\n      text.gsub(PATTERNS[:special_chars]) do |match|\n        case match\n        when '&amp;' then '&amp;amp;'\n        when '&lt;' then '&amp;lt;'\n        when '&gt;' then '&amp;gt;'\n        when '\"' then '&amp;quot;'\n        when \"'\" then '&amp;#039;'\n        end\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">CSV\u30d1\u30fc\u30b9\u51e6\u7406\u3067\u4f7f\u3048\u308b\u6b63\u898f\u8868\u73fe<\/h3>\n\n\n\n<p>CSV\u51e6\u7406\u306f\u591a\u304f\u306e\u30c7\u30fc\u30bf\u51e6\u7406\u30bf\u30b9\u30af\u3067\u5fc5\u8981\u3068\u306a\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001CSV\u30d1\u30fc\u30b9\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module CSVProcessor\n  class Parser\n    # CSV\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u8b58\u5225\u3059\u308b\u30d1\u30bf\u30fc\u30f3\n    PATTERNS = {\n      # \u30ab\u30f3\u30de\u533a\u5207\u308a\u30d5\u30a3\u30fc\u30eb\u30c9\n      csv_field: \/(?:^|,)(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|([^,]*))\/, \n\n      # \u30c0\u30d6\u30eb\u30af\u30a9\u30fc\u30c8\u306e\u30a8\u30b9\u30b1\u30fc\u30d7\u3092\u89e3\u9664\n      unescape_quotes: \/\"\"\/,\n\n      # \u884c\u672b\u306e\u6539\u884c\u6587\u5b57\n      line_ending: \/\\r\\n?|\\n\/\n    }\n\n    def self.parse_line(line)\n      fields = []\n      line.scan(PATTERNS[:csv_field]) do |quoted, unquoted|\n        field = if quoted\n                 # \u30c0\u30d6\u30eb\u30af\u30a9\u30fc\u30c8\u3067\u30a8\u30b9\u30b1\u30fc\u30d7\u3055\u308c\u305f\u30d5\u30a3\u30fc\u30eb\u30c9\n                 quoted.gsub(PATTERNS[:unescape_quotes], '\"')\n               else\n                 # \u901a\u5e38\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\n                 unquoted || \"\"\n               end\n        fields &lt;&lt; field\n      end\n      fields\n    end\n\n    def self.process_csv(file_path)\n      results = []\n      current_line = \"\"\n\n      File.foreach(file_path, encoding: 'UTF-8') do |line|\n        current_line &lt;&lt; line\n\n        # \u884c\u304c\u5b8c\u5168\u306a\u5834\u5408\uff08\u30af\u30a9\u30fc\u30c8\u304c\u9589\u3058\u3066\u3044\u308b\uff09\u306e\u307f\u51e6\u7406\n        if complete_line?(current_line)\n          results &lt;&lt; parse_line(current_line.chomp)\n          current_line = \"\"\n        end\n      end\n\n      results\n    end\n\n    private\n\n    def self.complete_line?(line)\n      # \u30c0\u30d6\u30eb\u30af\u30a9\u30fc\u30c8\u306e\u6570\u304c\u5076\u6570\u3067\u3042\u308b\u3053\u3068\u3092\u78ba\u8a8d\n      line.count('\"') % 2 == 0\n    end\n  end\n\n  # \u4f7f\u7528\u4f8b\n  class Example\n    def self.demonstrate\n      csv_data = &lt;&lt;~CSV\n        \"Name\",\"Age\",\"City\"\n        \"John Doe\",30,\"New York\"\n        \"Jane Smith\",25,\"Los Angeles\"\n        \"Bob Johnson\",45,\"Chicago\"\n      CSV\n\n      File.write('sample.csv', csv_data)\n      results = Parser.process_csv('sample.csv')\n\n      results.each do |row|\n        puts \"Name: #{row[0]}, Age: #{row[1]}, City: #{row[2]}\"\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u306f\u3001\u5b9f\u52d9\u3067\u306e\u4e00\u822c\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002\u5404\u30d1\u30bf\u30fc\u30f3\u3092\u7406\u89e3\u3057\u3001\u9069\u5207\u306b\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u51e6\u7406\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u306e\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-24\">\u6b63\u898f\u8868\u73fe\u306e\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">\u6b63\u898f\u8868\u73fe\u30c7\u30d0\u30c3\u30ac\u30fc\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u306e\u30c7\u30d0\u30c3\u30b0\u306b\u306f\u3001\u9069\u5207\u306a\u30c4\u30fc\u30eb\u3068\u624b\u6cd5\u306e\u4f7f\u7528\u304c\u4e0d\u53ef\u6b20\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001Ruby\u3067\u306e\u6b63\u898f\u8868\u73fe\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module RegexDebugger\n  class Debugger\n    def self.analyze_pattern(pattern, test_string)\n      results = {}\n\n      # \u30d1\u30bf\u30fc\u30f3\u306e\u57fa\u672c\u60c5\u5831\n      results[:pattern] = pattern.inspect\n      results[:options] = pattern.options\n\n      # \u30de\u30c3\u30c1\u30f3\u30b0\u7d50\u679c\u306e\u89e3\u6790\n      results[:match_data] = begin\n        match = pattern.match(test_string)\n        if match\n          {\n            full_match: match[0],\n            captures: match.captures,\n            named_captures: match.named_captures,\n            begin: match.begin(0),\n            end: match.end(0)\n          }\n        else\n          nil\n        end\n      end\n\n      # \u30d1\u30bf\u30fc\u30f3\u306e\u90e8\u5206\u30de\u30c3\u30c1\u306e\u30c6\u30b9\u30c8\n      results[:partial_matches] = find_partial_matches(pattern, test_string)\n\n      results\n    end\n\n    def self.visualize_match(pattern, test_string)\n      match = pattern.match(test_string)\n      return \"No match found\" unless match\n\n      # \u30de\u30c3\u30c1\u3057\u305f\u90e8\u5206\u3092\u53ef\u8996\u5316\n      result = test_string.dup\n      offset = 0\n\n      match.to_a.each_with_index do |m, i|\n        next if i == 0 || m.nil?\n        start_pos = match.begin(i) + offset\n        end_pos = match.end(i) + offset\n\n        # \u30de\u30c3\u30c1\u3057\u305f\u90e8\u5206\u3092\u5f37\u8abf\u8868\u793a\n        result.insert(end_pos, ']')\n        result.insert(start_pos, '[')\n        offset += 2\n      end\n\n      result\n    end\n\n    private\n\n    def self.find_partial_matches(pattern, test_string)\n      parts = pattern.source.scan(\/\\(\\?&lt;\\w+&gt;.*?\\)|\\(.*?\\)|\\[.*?\\]|\\\\.|.\/)\n      results = []\n\n      parts.each do |part|\n        begin\n          sub_pattern = Regexp.new(part)\n          if match = test_string.match(sub_pattern)\n            results &lt;&lt; {\n              part: part,\n              matched: match[0],\n              position: match.begin(0)\n            }\n          end\n        rescue RegexpError\n          results &lt;&lt; {\n            part: part,\n            error: \"Invalid partial pattern\"\n          }\n        end\n      end\n\n      results\n    end\n  end\nend\n\n# \u30c7\u30d0\u30c3\u30b0\u652f\u63f4\u30af\u30e9\u30b9\nclass RegexTester\n  def self.demonstrate\n    pattern = \/(?&lt;word&gt;\\w+)\\s+(?&lt;number&gt;\\d+)\/\n    test_string = \"hello 123 world 456\"\n\n    # \u30d1\u30bf\u30fc\u30f3\u306e\u89e3\u6790\n    results = RegexDebugger::Debugger.analyze_pattern(pattern, test_string)\n\n    # \u7d50\u679c\u306e\u8868\u793a\n    puts \"Pattern Analysis:\"\n    puts \"Pattern: #{results[:pattern]}\"\n    puts \"Options: #{results[:options]}\"\n    puts \"\\nMatch Data:\"\n    if results[:match_data]\n      puts \"Full match: #{results[:match_data][:full_match]}\"\n      puts \"Captures: #{results[:match_data][:captures]}\"\n      puts \"Named captures: #{results[:match_data][:named_captures]}\"\n    else\n      puts \"No match found\"\n    end\n\n    # \u30de\u30c3\u30c1\u306e\u53ef\u8996\u5316\n    puts \"\\nVisualized Match:\"\n    puts RegexDebugger::Debugger.visualize_match(pattern, test_string)\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u306e\u5b9f\u88c5\u3067\u906d\u9047\u3059\u308b\u4e00\u822c\u7684\u306a\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module RegexErrorHandler\n  class ErrorSolver\n    # \u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u30d1\u30bf\u30fc\u30f3\u3068\u89e3\u6c7a\u65b9\u6cd5\n    COMMON_ERRORS = {\n      syntax_error: {\n        pattern: \/unterminated\/i,\n        solution: \"\u62ec\u5f27\u3084\u30af\u30a9\u30fc\u30c8\u306e\u5bfe\u5fdc\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      },\n      invalid_range: {\n        pattern: \/invalid char\/i,\n        solution: \"\u6587\u5b57\u30af\u30e9\u30b9\u306e\u7bc4\u56f2\u6307\u5b9a\u304c\u6b63\u3057\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      },\n      encoding_error: {\n        pattern: \/invalid byte sequence\/i,\n        solution: \"\u6587\u5b57\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u8a2d\u5b9a\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      }\n    }\n\n    def self.diagnose_and_fix(error)\n      COMMON_ERRORS.each do |type, info|\n        if error.message.match?(info[:pattern])\n          return {\n            error_type: type,\n            message: error.message,\n            solution: info[:solution]\n          }\n        end\n      end\n\n      { error_type: :unknown, message: error.message, solution: \"\u8a73\u7d30\u306a\u89e3\u6790\u304c\u5fc5\u8981\u3067\u3059\u3002\" }\n    end\n\n    # \u30a8\u30e9\u30fc\u306e\u81ea\u52d5\u4fee\u6b63\u3092\u8a66\u307f\u308b\n    def self.attempt_fix(pattern_string)\n      fixes = {\n        # \u672a\u7d42\u4e86\u306e\u62ec\u5f27\u3092\u4fee\u6b63\n        \/\\([^\\)]*\\z\/ =&gt; ')',\n        # \u30a8\u30b9\u30b1\u30fc\u30d7\u3055\u308c\u3066\u3044\u306a\u3044\u7279\u6b8a\u6587\u5b57\u3092\u4fee\u6b63\n        \/(?&lt;!\\\\)[.+*?]\/ =&gt; '\\\\\\&amp;',\n        # \u4e0d\u6b63\u306a\u6587\u5b57\u30af\u30e9\u30b9\u3092\u4fee\u6b63\n        \/\\[([^\\]]*)\\]\/ =&gt; -&gt;(m) { fix_character_class(m[1]) }\n      }\n\n      result = pattern_string.dup\n      fixes.each do |error_pattern, fix|\n        if fix.is_a?(Proc)\n          result.gsub!(error_pattern, &amp;fix)\n        else\n          result.gsub!(error_pattern, fix)\n        end\n      end\n\n      result\n    end\n\n    private\n\n    def self.fix_character_class(content)\n      # \u6587\u5b57\u30af\u30e9\u30b9\u5185\u306e\u554f\u984c\u3092\u4fee\u6b63\n      fixed = content.gsub(\/(?&lt;!\\\\)-(?![\\w\\s])\/, '\\\\-')  # \u30a8\u30b9\u30b1\u30fc\u30d7\u3055\u308c\u3066\u3044\u306a\u3044\u30cf\u30a4\u30d5\u30f3\u3092\u4fee\u6b63\n      \"[#{fixed}]\"\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">\u30d1\u30bf\u30fc\u30f3\u306e\u6bb5\u968e\u7684\u306a\u6539\u5584\u624b\u6cd5<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u3092\u6bb5\u968e\u7684\u306b\u6539\u5584\u3059\u308b\u305f\u3081\u306e\u624b\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module RegexOptimizer\n  class PatternImprover\n    def self.analyze_and_improve(pattern)\n      improvements = []\n\n      # \u30d1\u30bf\u30fc\u30f3\u306e\u8907\u96d1\u3055\u3092\u5206\u6790\n      complexity = analyze_complexity(pattern)\n\n      # \u6539\u5584\u63d0\u6848\u3092\u751f\u6210\n      if complexity[:backtracking_risk]\n        improvements &lt;&lt; create_improvement(\n          :backtracking,\n          \"\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u306e\u30ea\u30b9\u30af\u304c\u3042\u308a\u307e\u3059\",\n          suggest_backtracking_fix(pattern)\n        )\n      end\n\n      if complexity[:readability_issues]\n        improvements &lt;&lt; create_improvement(\n          :readability,\n          \"\u53ef\u8aad\u6027\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3059\",\n          suggest_readability_fix(pattern)\n        )\n      end\n\n      if complexity[:performance_issues]\n        improvements &lt;&lt; create_improvement(\n          :performance,\n          \"\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u554f\u984c\u304c\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\",\n          suggest_performance_fix(pattern)\n        )\n      end\n\n      improvements\n    end\n\n    private\n\n    def self.analyze_complexity(pattern)\n      {\n        backtracking_risk: check_backtracking_risk(pattern),\n        readability_issues: check_readability_issues(pattern),\n        performance_issues: check_performance_issues(pattern)\n      }\n    end\n\n    def self.check_backtracking_risk(pattern)\n      source = pattern.source\n      # \u30cd\u30b9\u30c8\u3055\u308c\u305f\u91cf\u6307\u5b9a\u5b50\u3092\u30c1\u30a7\u30c3\u30af\n      source.match?(\/\\(.*[\\*\\+]\\)[\\*\\+]\/) ||\n        # \u904e\u5ea6\u306b\u8907\u96d1\u306a\u5f8c\u65b9\u53c2\u7167\u3092\u30c1\u30a7\u30c3\u30af\n        source.match?(\/\\(\\?:.+\\).*\\\\\\d+\/)\n    end\n\n    def self.check_readability_issues(pattern)\n      source = pattern.source\n      # \u9577\u3059\u304e\u308b\u30d1\u30bf\u30fc\u30f3\u3092\u30c1\u30a7\u30c3\u30af\n      source.length &gt; 100 ||\n        # \u30b3\u30e1\u30f3\u30c8\u306e\u306a\u3044\u8907\u96d1\u306a\u30d1\u30bf\u30fc\u30f3\u3092\u30c1\u30a7\u30c3\u30af\n        source.match?(\/\\(\\?[!&lt;:]\/) &amp;&amp; !pattern.options.include?(\/x\/)\n    end\n\n    def self.check_performance_issues(pattern)\n      source = pattern.source\n      # \u975e\u52b9\u7387\u306a\u69cb\u9020\u3092\u30c1\u30a7\u30c3\u30af\n      source.match?(\/\\.\\*.*\\.\\*\/) ||\n        # \u904e\u5ea6\u306a\u5f8c\u65b9\u53c2\u7167\u306e\u4f7f\u7528\u3092\u30c1\u30a7\u30c3\u30af\n        source.scan(\/\\\\\\d+\/).length &gt; 3\n    end\n\n    def self.create_improvement(type, description, suggestion)\n      {\n        type: type,\n        description: description,\n        suggestion: suggestion\n      }\n    end\n\n    def self.suggest_backtracking_fix(pattern)\n      source = pattern.source\n      if source.match?(\/\\(.*[\\*\\+]\\)[\\*\\+]\/)\n        \"\u91cf\u6307\u5b9a\u5b50\u306e\u30cd\u30b9\u30c8\u3092\u907f\u3051\u3001\u30a2\u30c8\u30df\u30c3\u30af\u30b0\u30eb\u30fc\u30d7(?&gt;...)\u306e\u4f7f\u7528\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      elsif source.match?(\/\\(\\?:.+\\).*\\\\\\d+\/)\n        \"\u5f8c\u65b9\u53c2\u7167\u306e\u4f7f\u7528\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u3001\u540d\u524d\u4ed8\u304d\u30ad\u30e3\u30d7\u30c1\u30e3\u306e\u4f7f\u7528\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      end\n    end\n\n    def self.suggest_readability_fix(pattern)\n      source = pattern.source\n      if source.length &gt; 100\n        \"\u30d1\u30bf\u30fc\u30f3\u3092\u5c0f\u3055\u306a\u90e8\u5206\u306b\u5206\u5272\u3057\u3001\u305d\u308c\u305e\u308c\u306b\u610f\u5473\u306e\u3042\u308b\u540d\u524d\u3092\u4ed8\u3051\u308b\u3053\u3068\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      elsif source.match?(\/\\(\\?[!&lt;:]\/)\n        \"x \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u3066\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0\u3057\u3001\u30d1\u30bf\u30fc\u30f3\u3092\u6574\u7406\u3059\u308b\u3053\u3068\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      end\n    end\n\n    def self.suggest_performance_fix(pattern)\n      source = pattern.source\n      if source.match?(\/\\.\\*.*\\.\\*\/)\n        \"\u8caa\u6b32\u306a\u91cf\u6307\u5b9a\u5b50\u306e\u4f7f\u7528\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u3001\u3088\u308a\u5177\u4f53\u7684\u306a\u30d1\u30bf\u30fc\u30f3\u306e\u4f7f\u7528\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      elsif source.scan(\/\\\\\\d+\/).length &gt; 3\n        \"\u5f8c\u65b9\u53c2\u7167\u306e\u6570\u3092\u6e1b\u3089\u3057\u3001\u30d1\u30bf\u30fc\u30f3\u306e\u69cb\u9020\u3092\u7c21\u7565\u5316\u3059\u308b\u3053\u3068\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c7\u30d0\u30c3\u30b0\u30c4\u30fc\u30eb\u3068\u624b\u6cd5\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u6b63\u898f\u8868\u73fe\u306e\u554f\u984c\u3092\u52b9\u7387\u7684\u306b\u7279\u5b9a\u3057\u3001\u89e3\u6c7a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u7279\u306b\u3001\u30d1\u30bf\u30fc\u30f3\u306e\u6bb5\u968e\u7684\u306a\u6539\u5584\u306f\u3001\u6b63\u898f\u8868\u73fe\u306e\u54c1\u8cea\u3092\u7dad\u6301\u30fb\u5411\u4e0a\u3055\u305b\u308b\u4e0a\u3067\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u307e\u305f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30c7\u30d0\u30c3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u5fc3\u304c\u3051\u307e\u3057\u3087\u3046\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5c0f\u3055\u306a\u5358\u4f4d\u3067\u306e\u30c6\u30b9\u30c8<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d1\u30bf\u30fc\u30f3\u3092\u5c0f\u3055\u306a\u90e8\u5206\u306b\u5206\u5272\u3057\u3066\u30c6\u30b9\u30c8<\/li>\n\n\n\n<li>\u30a8\u30c3\u30b8\u30b1\u30fc\u30b9\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u90e8\u5206\u7684\u306a\u30de\u30c3\u30c1\u306e\u691c\u8a3c<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u53ef\u8996\u5316\u30c4\u30fc\u30eb\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30c3\u30c1\u30f3\u30b0\u7d50\u679c\u306e\u8996\u899a\u7684\u306a\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30d1\u30bf\u30fc\u30f3\u306e\u69cb\u9020\u5206\u6790<\/li>\n\n\n\n<li>\u90e8\u5206\u30de\u30c3\u30c1\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u76e3\u8996<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9f\u884c\u6642\u9593\u306e\u8a08\u6e2c<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306e\u7279\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6bb5\u968e\u7684\u306a\u6539\u5584<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u554f\u984c\u306e\u7279\u5b9a\u3068\u5206\u6790<\/li>\n\n\n\n<li>\u6539\u5584\u6848\u306e\u691c\u8a0e\u3068\u5b9f\u88c5<\/li>\n\n\n\n<li>\u6539\u5584\u52b9\u679c\u306e\u691c\u8a3c<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u624b\u6cd5\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u52b9\u7387\u7684\u306a\u6b63\u898f\u8868\u73fe\u306e\u30c7\u30d0\u30c3\u30b0\u3068\u6539\u5584\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-28\">\u6b63\u898f\u8868\u73fe\u306e\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">\u6b63\u898f\u8868\u73fe\u30c7\u30d0\u30c3\u30ac\u30fc\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u306e\u30c7\u30d0\u30c3\u30b0\u306b\u306f\u3001\u9069\u5207\u306a\u30c4\u30fc\u30eb\u3068\u624b\u6cd5\u306e\u4f7f\u7528\u304c\u4e0d\u53ef\u6b20\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001Ruby\u3067\u306e\u6b63\u898f\u8868\u73fe\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module RegexDebugger\n  class Debugger\n    def self.analyze_pattern(pattern, test_string)\n      results = {}\n\n      # \u30d1\u30bf\u30fc\u30f3\u306e\u57fa\u672c\u60c5\u5831\n      results[:pattern] = pattern.inspect\n      results[:options] = pattern.options\n\n      # \u30de\u30c3\u30c1\u30f3\u30b0\u7d50\u679c\u306e\u89e3\u6790\n      results[:match_data] = begin\n        match = pattern.match(test_string)\n        if match\n          {\n            full_match: match[0],\n            captures: match.captures,\n            named_captures: match.named_captures,\n            begin: match.begin(0),\n            end: match.end(0)\n          }\n        else\n          nil\n        end\n      end\n\n      # \u30d1\u30bf\u30fc\u30f3\u306e\u90e8\u5206\u30de\u30c3\u30c1\u306e\u30c6\u30b9\u30c8\n      results[:partial_matches] = find_partial_matches(pattern, test_string)\n\n      results\n    end\n\n    def self.visualize_match(pattern, test_string)\n      match = pattern.match(test_string)\n      return \"No match found\" unless match\n\n      # \u30de\u30c3\u30c1\u3057\u305f\u90e8\u5206\u3092\u53ef\u8996\u5316\n      result = test_string.dup\n      offset = 0\n\n      match.to_a.each_with_index do |m, i|\n        next if i == 0 || m.nil?\n        start_pos = match.begin(i) + offset\n        end_pos = match.end(i) + offset\n\n        # \u30de\u30c3\u30c1\u3057\u305f\u90e8\u5206\u3092\u5f37\u8abf\u8868\u793a\n        result.insert(end_pos, ']')\n        result.insert(start_pos, '[')\n        offset += 2\n      end\n\n      result\n    end\n\n    private\n\n    def self.find_partial_matches(pattern, test_string)\n      parts = pattern.source.scan(\/\\(\\?&lt;\\w+&gt;.*?\\)|\\(.*?\\)|\\[.*?\\]|\\\\.|.\/)\n      results = []\n\n      parts.each do |part|\n        begin\n          sub_pattern = Regexp.new(part)\n          if match = test_string.match(sub_pattern)\n            results &lt;&lt; {\n              part: part,\n              matched: match[0],\n              position: match.begin(0)\n            }\n          end\n        rescue RegexpError\n          results &lt;&lt; {\n            part: part,\n            error: \"Invalid partial pattern\"\n          }\n        end\n      end\n\n      results\n    end\n  end\nend\n\n# \u30c7\u30d0\u30c3\u30b0\u652f\u63f4\u30af\u30e9\u30b9\nclass RegexTester\n  def self.demonstrate\n    pattern = \/(?&lt;word&gt;\\w+)\\s+(?&lt;number&gt;\\d+)\/\n    test_string = \"hello 123 world 456\"\n\n    # \u30d1\u30bf\u30fc\u30f3\u306e\u89e3\u6790\n    results = RegexDebugger::Debugger.analyze_pattern(pattern, test_string)\n\n    # \u7d50\u679c\u306e\u8868\u793a\n    puts \"Pattern Analysis:\"\n    puts \"Pattern: #{results[:pattern]}\"\n    puts \"Options: #{results[:options]}\"\n    puts \"\\nMatch Data:\"\n    if results[:match_data]\n      puts \"Full match: #{results[:match_data][:full_match]}\"\n      puts \"Captures: #{results[:match_data][:captures]}\"\n      puts \"Named captures: #{results[:match_data][:named_captures]}\"\n    else\n      puts \"No match found\"\n    end\n\n    # \u30de\u30c3\u30c1\u306e\u53ef\u8996\u5316\n    puts \"\\nVisualized Match:\"\n    puts RegexDebugger::Debugger.visualize_match(pattern, test_string)\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-30\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u306e\u5b9f\u88c5\u3067\u906d\u9047\u3059\u308b\u4e00\u822c\u7684\u306a\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module RegexErrorHandler\n  class ErrorSolver\n    # \u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u30d1\u30bf\u30fc\u30f3\u3068\u89e3\u6c7a\u65b9\u6cd5\n    COMMON_ERRORS = {\n      syntax_error: {\n        pattern: \/unterminated\/i,\n        solution: \"\u62ec\u5f27\u3084\u30af\u30a9\u30fc\u30c8\u306e\u5bfe\u5fdc\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      },\n      invalid_range: {\n        pattern: \/invalid char\/i,\n        solution: \"\u6587\u5b57\u30af\u30e9\u30b9\u306e\u7bc4\u56f2\u6307\u5b9a\u304c\u6b63\u3057\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      },\n      encoding_error: {\n        pattern: \/invalid byte sequence\/i,\n        solution: \"\u6587\u5b57\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u8a2d\u5b9a\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      }\n    }\n\n    def self.diagnose_and_fix(error)\n      COMMON_ERRORS.each do |type, info|\n        if error.message.match?(info[:pattern])\n          return {\n            error_type: type,\n            message: error.message,\n            solution: info[:solution]\n          }\n        end\n      end\n\n      { error_type: :unknown, message: error.message, solution: \"\u8a73\u7d30\u306a\u89e3\u6790\u304c\u5fc5\u8981\u3067\u3059\u3002\" }\n    end\n\n    # \u30a8\u30e9\u30fc\u306e\u81ea\u52d5\u4fee\u6b63\u3092\u8a66\u307f\u308b\n    def self.attempt_fix(pattern_string)\n      fixes = {\n        # \u672a\u7d42\u4e86\u306e\u62ec\u5f27\u3092\u4fee\u6b63\n        \/\\([^\\)]*\\z\/ =&gt; ')',\n        # \u30a8\u30b9\u30b1\u30fc\u30d7\u3055\u308c\u3066\u3044\u306a\u3044\u7279\u6b8a\u6587\u5b57\u3092\u4fee\u6b63\n        \/(?&lt;!\\\\)[.+*?]\/ =&gt; '\\\\\\&amp;',\n        # \u4e0d\u6b63\u306a\u6587\u5b57\u30af\u30e9\u30b9\u3092\u4fee\u6b63\n        \/\\[([^\\]]*)\\]\/ =&gt; -&gt;(m) { fix_character_class(m[1]) }\n      }\n\n      result = pattern_string.dup\n      fixes.each do |error_pattern, fix|\n        if fix.is_a?(Proc)\n          result.gsub!(error_pattern, &amp;fix)\n        else\n          result.gsub!(error_pattern, fix)\n        end\n      end\n\n      result\n    end\n\n    private\n\n    def self.fix_character_class(content)\n      # \u6587\u5b57\u30af\u30e9\u30b9\u5185\u306e\u554f\u984c\u3092\u4fee\u6b63\n      fixed = content.gsub(\/(?&lt;!\\\\)-(?![\\w\\s])\/, '\\\\-')  # \u30a8\u30b9\u30b1\u30fc\u30d7\u3055\u308c\u3066\u3044\u306a\u3044\u30cf\u30a4\u30d5\u30f3\u3092\u4fee\u6b63\n      \"[#{fixed}]\"\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-31\">\u30d1\u30bf\u30fc\u30f3\u306e\u6bb5\u968e\u7684\u306a\u6539\u5584\u624b\u6cd5<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u3092\u6bb5\u968e\u7684\u306b\u6539\u5584\u3059\u308b\u305f\u3081\u306e\u624b\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module RegexOptimizer\n  class PatternImprover\n    def self.analyze_and_improve(pattern)\n      improvements = []\n\n      # \u30d1\u30bf\u30fc\u30f3\u306e\u8907\u96d1\u3055\u3092\u5206\u6790\n      complexity = analyze_complexity(pattern)\n\n      # \u6539\u5584\u63d0\u6848\u3092\u751f\u6210\n      if complexity[:backtracking_risk]\n        improvements &lt;&lt; create_improvement(\n          :backtracking,\n          \"\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u306e\u30ea\u30b9\u30af\u304c\u3042\u308a\u307e\u3059\",\n          suggest_backtracking_fix(pattern)\n        )\n      end\n\n      if complexity[:readability_issues]\n        improvements &lt;&lt; create_improvement(\n          :readability,\n          \"\u53ef\u8aad\u6027\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3059\",\n          suggest_readability_fix(pattern)\n        )\n      end\n\n      if complexity[:performance_issues]\n        improvements &lt;&lt; create_improvement(\n          :performance,\n          \"\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u554f\u984c\u304c\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\",\n          suggest_performance_fix(pattern)\n        )\n      end\n\n      improvements\n    end\n\n    private\n\n    def self.analyze_complexity(pattern)\n      {\n        backtracking_risk: check_backtracking_risk(pattern),\n        readability_issues: check_readability_issues(pattern),\n        performance_issues: check_performance_issues(pattern)\n      }\n    end\n\n    def self.check_backtracking_risk(pattern)\n      source = pattern.source\n      # \u30cd\u30b9\u30c8\u3055\u308c\u305f\u91cf\u6307\u5b9a\u5b50\u3092\u30c1\u30a7\u30c3\u30af\n      source.match?(\/\\(.*[\\*\\+]\\)[\\*\\+]\/) ||\n        # \u904e\u5ea6\u306b\u8907\u96d1\u306a\u5f8c\u65b9\u53c2\u7167\u3092\u30c1\u30a7\u30c3\u30af\n        source.match?(\/\\(\\?:.+\\).*\\\\\\d+\/)\n    end\n\n    def self.check_readability_issues(pattern)\n      source = pattern.source\n      # \u9577\u3059\u304e\u308b\u30d1\u30bf\u30fc\u30f3\u3092\u30c1\u30a7\u30c3\u30af\n      source.length &gt; 100 ||\n        # \u30b3\u30e1\u30f3\u30c8\u306e\u306a\u3044\u8907\u96d1\u306a\u30d1\u30bf\u30fc\u30f3\u3092\u30c1\u30a7\u30c3\u30af\n        source.match?(\/\\(\\?[!&lt;:]\/) &amp;&amp; !pattern.options.include?(\/x\/)\n    end\n\n    def self.check_performance_issues(pattern)\n      source = pattern.source\n      # \u975e\u52b9\u7387\u306a\u69cb\u9020\u3092\u30c1\u30a7\u30c3\u30af\n      source.match?(\/\\.\\*.*\\.\\*\/) ||\n        # \u904e\u5ea6\u306a\u5f8c\u65b9\u53c2\u7167\u306e\u4f7f\u7528\u3092\u30c1\u30a7\u30c3\u30af\n        source.scan(\/\\\\\\d+\/).length &gt; 3\n    end\n\n    def self.create_improvement(type, description, suggestion)\n      {\n        type: type,\n        description: description,\n        suggestion: suggestion\n      }\n    end\n\n    def self.suggest_backtracking_fix(pattern)\n      source = pattern.source\n      if source.match?(\/\\(.*[\\*\\+]\\)[\\*\\+]\/)\n        \"\u91cf\u6307\u5b9a\u5b50\u306e\u30cd\u30b9\u30c8\u3092\u907f\u3051\u3001\u30a2\u30c8\u30df\u30c3\u30af\u30b0\u30eb\u30fc\u30d7(?&gt;...)\u306e\u4f7f\u7528\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      elsif source.match?(\/\\(\\?:.+\\).*\\\\\\d+\/)\n        \"\u5f8c\u65b9\u53c2\u7167\u306e\u4f7f\u7528\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u3001\u540d\u524d\u4ed8\u304d\u30ad\u30e3\u30d7\u30c1\u30e3\u306e\u4f7f\u7528\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      end\n    end\n\n    def self.suggest_readability_fix(pattern)\n      source = pattern.source\n      if source.length &gt; 100\n        \"\u30d1\u30bf\u30fc\u30f3\u3092\u5c0f\u3055\u306a\u90e8\u5206\u306b\u5206\u5272\u3057\u3001\u305d\u308c\u305e\u308c\u306b\u610f\u5473\u306e\u3042\u308b\u540d\u524d\u3092\u4ed8\u3051\u308b\u3053\u3068\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      elsif source.match?(\/\\(\\?[!&lt;:]\/)\n        \"x \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u3066\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0\u3057\u3001\u30d1\u30bf\u30fc\u30f3\u3092\u6574\u7406\u3059\u308b\u3053\u3068\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      end\n    end\n\n    def self.suggest_performance_fix(pattern)\n      source = pattern.source\n      if source.match?(\/\\.\\*.*\\.\\*\/)\n        \"\u8caa\u6b32\u306a\u91cf\u6307\u5b9a\u5b50\u306e\u4f7f\u7528\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u3001\u3088\u308a\u5177\u4f53\u7684\u306a\u30d1\u30bf\u30fc\u30f3\u306e\u4f7f\u7528\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      elsif source.scan(\/\\\\\\d+\/).length &gt; 3\n        \"\u5f8c\u65b9\u53c2\u7167\u306e\u6570\u3092\u6e1b\u3089\u3057\u3001\u30d1\u30bf\u30fc\u30f3\u306e\u69cb\u9020\u3092\u7c21\u7565\u5316\u3059\u308b\u3053\u3068\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c7\u30d0\u30c3\u30b0\u30c4\u30fc\u30eb\u3068\u624b\u6cd5\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u6b63\u898f\u8868\u73fe\u306e\u554f\u984c\u3092\u52b9\u7387\u7684\u306b\u7279\u5b9a\u3057\u3001\u89e3\u6c7a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u7279\u306b\u3001\u30d1\u30bf\u30fc\u30f3\u306e\u6bb5\u968e\u7684\u306a\u6539\u5584\u306f\u3001\u6b63\u898f\u8868\u73fe\u306e\u54c1\u8cea\u3092\u7dad\u6301\u30fb\u5411\u4e0a\u3055\u305b\u308b\u4e0a\u3067\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u307e\u305f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30c7\u30d0\u30c3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u5fc3\u304c\u3051\u307e\u3057\u3087\u3046\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5c0f\u3055\u306a\u5358\u4f4d\u3067\u306e\u30c6\u30b9\u30c8<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d1\u30bf\u30fc\u30f3\u3092\u5c0f\u3055\u306a\u90e8\u5206\u306b\u5206\u5272\u3057\u3066\u30c6\u30b9\u30c8<\/li>\n\n\n\n<li>\u30a8\u30c3\u30b8\u30b1\u30fc\u30b9\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u90e8\u5206\u7684\u306a\u30de\u30c3\u30c1\u306e\u691c\u8a3c<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u53ef\u8996\u5316\u30c4\u30fc\u30eb\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30c3\u30c1\u30f3\u30b0\u7d50\u679c\u306e\u8996\u899a\u7684\u306a\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30d1\u30bf\u30fc\u30f3\u306e\u69cb\u9020\u5206\u6790<\/li>\n\n\n\n<li>\u90e8\u5206\u30de\u30c3\u30c1\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u76e3\u8996<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9f\u884c\u6642\u9593\u306e\u8a08\u6e2c<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306e\u7279\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6bb5\u968e\u7684\u306a\u6539\u5584<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u554f\u984c\u306e\u7279\u5b9a\u3068\u5206\u6790<\/li>\n\n\n\n<li>\u6539\u5584\u6848\u306e\u691c\u8a0e\u3068\u5b9f\u88c5<\/li>\n\n\n\n<li>\u6539\u5584\u52b9\u679c\u306e\u691c\u8a3c<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u624b\u6cd5\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u52b9\u7387\u7684\u306a\u6b63\u898f\u8868\u73fe\u306e\u30c7\u30d0\u30c3\u30b0\u3068\u6539\u5584\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-1554","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ruby","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1554","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1554"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1554\/revisions"}],"predecessor-version":[{"id":1555,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1554\/revisions\/1555"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1554"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1554"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1554"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}