{"id":2116,"date":"2025-03-24T08:48:16","date_gmt":"2025-03-23T23:48:16","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2116"},"modified":"2025-03-24T08:48:41","modified_gmt":"2025-03-23T23:48:41","slug":"c-stringfind%e5%ae%8c%e5%85%a8%e6%94%bb%e7%95%a5%ef%bc%9a%e5%9f%ba%e6%9c%ac%e3%81%8b%e3%82%89%e5%bf%9c%e7%94%a8%e3%81%be%e3%81%a7%e4%bd%bf%e3%81%84%e3%81%93%e3%81%aa%e3%81%997%e3%81%a4%e3%81%ae","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2116","title":{"rendered":"C++ string::find\u5b8c\u5168\u653b\u7565\uff1a\u57fa\u672c\u304b\u3089\u5fdc\u7528\u307e\u3067\u4f7f\u3044\u3053\u306a\u30597\u3064\u306e\u5b9f\u8df5\u30c6\u30af\u30cb\u30c3\u30af"},"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\">    <span><\/span>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-0\">string::find \u306e\u57fa\u790e\u77e5\u8b58<\/a>      <\/li>      <li>        <a href=\"#i-3\">string::find \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/a>      <\/li>      <li>        <a href=\"#i-6\">string::find \u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/a>      <\/li>      <li>        <a href=\"#i-9\">string::find \u306e\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-12\">string::find \u306e\u4ee3\u66ff\u624b\u6bb5\u3068\u6bd4\u8f03<\/a>      <\/li>      <li>        <a href=\"#i-15\">string::find \u306e\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-18\">string::find \u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-20\">include<\/a>  <\/li>  <li>    <a href=\"#i-21\">include<\/a>  <\/li>  <li>    <a href=\"#i-22\">include<\/a>  <\/li>  <li class=\"last\">    <a href=\"#i-23\">include<\/a>  <\/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\">string::find \u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<p>\u6587\u5b57\u5217\u691c\u7d22\u306f\u591a\u304f\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u5fc5\u8981\u3068\u3055\u308c\u308b\u57fa\u672c\u7684\u306a\u64cd\u4f5c\u306e1\u3064\u3067\u3059\u3002C++\u3067\u306f\u3001std::string \u30af\u30e9\u30b9\u306e find \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306a\u6587\u5b57\u5217\u691c\u7d22\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001string::find \u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\u304b\u3089\u3001\u623b\u308a\u5024\u306e\u6b63\u3057\u3044\u89e3\u91c8\u65b9\u6cd5\u307e\u3067\u8a73\u3057\u304f\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">string::find \u30e1\u30bd\u30c3\u30c9\u306e\u57fa\u672c\u69cb\u6587\u3068\u623b\u308a\u5024\u3092\u7406\u89e3\u3059\u308b<\/h3>\n\n\n\n<p>string::find \u30e1\u30bd\u30c3\u30c9\u306f\u3001\u6587\u5b57\u5217\u5185\u3067\u6307\u5b9a\u3055\u308c\u305f\u90e8\u5206\u6587\u5b57\u5217\u3092\u691c\u7d22\u3059\u308b\u305f\u3081\u306e\u95a2\u6570\u3067\u3059\u3002\u57fa\u672c\u7684\u306a\u69cb\u6587\u306f\u4ee5\u4e0b\u306e\u901a\u308a\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=\"\">\/\/ \u57fa\u672c\u7684\u306a\u69cb\u6587\nsize_t find(const string&amp; str, size_t pos = 0) const;\nsize_t find(const char* s, size_t pos = 0) const;\nsize_t find(char c, size_t pos = 0) const;\nsize_t find(const char* s, size_t pos, size_t n) const;\n\n\/\/ \u4f7f\u7528\u4f8b\n#include &lt;iostream&gt;\n#include &lt;string&gt;\n\nint main() {\n    std::string text = \"Hello, C++ World!\";\n\n    \/\/ \u6587\u5b57\u5217\u3067\u306e\u691c\u7d22\n    size_t pos1 = text.find(\"C++\");        \/\/ \u7d50\u679c: 7\n\n    \/\/ \u6587\u5b57\u3067\u306e\u691c\u7d22\n    size_t pos2 = text.find('W');          \/\/ \u7d50\u679c: 11\n\n    \/\/ \u958b\u59cb\u4f4d\u7f6e\u3092\u6307\u5b9a\u3057\u305f\u691c\u7d22\n    size_t pos3 = text.find('o', 5);       \/\/ \u7d50\u679c: 13\n\n    std::cout &lt;&lt; \"pos1: \" &lt;&lt; pos1 &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"pos2: \" &lt;&lt; pos2 &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"pos3: \" &lt;&lt; pos3 &lt;&lt; std::endl;\n\n    return 0;\n}<\/pre>\n\n\n\n<p>find \u30e1\u30bd\u30c3\u30c9\u306f\u4ee5\u4e0b\u306e\u7279\u5fb4\u3092\u6301\u3063\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u623b\u308a\u5024\u306f size_t \u578b\u3067\u3001\u898b\u3064\u304b\u3063\u305f\u4f4d\u7f6e\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u8fd4\u3057\u307e\u3059<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306f0\u304b\u3089\u59cb\u307e\u308a\u307e\u3059<\/li>\n\n\n\n<li>\u691c\u7d22\u958b\u59cb\u4f4d\u7f6e\u3092\u6307\u5b9a\u3067\u304d\u307e\u3059\uff08\u30c7\u30d5\u30a9\u30eb\u30c8\u306f0\uff09<\/li>\n\n\n\n<li>\u6587\u5b57\u5217\u3001\u6587\u5b57\u3001\u6587\u5b57\u914d\u5217\u306e\u3044\u305a\u308c\u3082\u691c\u7d22\u53ef\u80fd\u3067\u3059<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">npos \u306e\u610f\u5473\u3068\u6b63\u3057\u3044\u4f7f\u3044\u65b9\u3092\u30de\u30b9\u30bf\u30fc\u3059\u308b<\/h3>\n\n\n\n<p>string::npos \u306f\u3001\u6587\u5b57\u5217\u691c\u7d22\u304c\u5931\u6557\u3057\u305f\u5834\u5408\u306b\u8fd4\u3055\u308c\u308b\u7279\u5225\u306a\u5024\u3067\u3059\u3002\u3053\u306e\u5024\u306e\u6b63\u3057\u3044\u7406\u89e3\u3068\u4f7f\u3044\u65b9\u306f\u3001\u5b89\u5168\u306a\u6587\u5b57\u5217\u51e6\u7406\u306b\u304a\u3044\u3066\u975e\u5e38\u306b\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=\"\">#include &lt;iostream&gt;\n#include &lt;string&gt;\n\nint main() {\n    std::string text = \"C++ Programming\";\n\n    \/\/ \u5b58\u5728\u3057\u306a\u3044\u6587\u5b57\u5217\u306e\u691c\u7d22\n    size_t pos = text.find(\"Java\");\n\n    \/\/ npos\u3068\u306e\u6bd4\u8f03\u306b\u3088\u308b\u691c\u7d22\u7d50\u679c\u306e\u5224\u5b9a\n    if (pos != std::string::npos) {\n        std::cout &lt;&lt; \"Found at position: \" &lt;&lt; pos &lt;&lt; std::endl;\n    } else {\n        std::cout &lt;&lt; \"String not found\" &lt;&lt; std::endl;\n    }\n\n    \/\/ \u3088\u304f\u3042\u308b\u9593\u9055\u3044\uff08\u3053\u308c\u306f\u5371\u967a\uff01\uff09\n    \/\/ if (pos &gt;= 0) \/\/ size_t \u306f\u7b26\u53f7\u306a\u3057\u6574\u6570\u306a\u306e\u3067\u3001\u5e38\u306btrue\u3068\u306a\u3063\u3066\u3057\u307e\u3046\n\n    \/\/ \u6b63\u3057\u3044\u4f7f\u3044\u65b9\u306e\u4f8b\n    std::string str = \"Hello, World!\";\n    if (str.find(\"Hello\") != std::string::npos) {\n        \/\/ \u6587\u5b57\u5217\u304c\u898b\u3064\u304b\u3063\u305f\u5834\u5408\u306e\u51e6\u7406\n        std::cout &lt;&lt; \"\u6587\u5b57\u5217\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\" &lt;&lt; std::endl;\n    }\n\n    \/\/ \u8907\u6570\u306e\u691c\u7d22\u3092\u9023\u643a\u3055\u305b\u308b\u4f8b\n    size_t start = str.find(\"Hello\");\n    if (start != std::string::npos) {\n        size_t end = str.find(\"!\", start);\n        if (end != std::string::npos) {\n            \/\/ Hello \u304b\u3089 ! \u307e\u3067\u306e\u90e8\u5206\u6587\u5b57\u5217\u3092\u53d6\u5f97\n            std::string substring = str.substr(start, end - start + 1);\n            std::cout &lt;&lt; \"\u62bd\u51fa\u3055\u308c\u305f\u6587\u5b57\u5217: \" &lt;&lt; substring &lt;&lt; std::endl;\n        }\n    }\n\n    return 0;\n}<\/pre>\n\n\n\n<p>npos \u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u578b\u306e\u4e00\u81f4\uff1anpos \u306f size_t \u578b\u306e\u5b9a\u6570\u3067\u3001\u6700\u5927\u5024\uff08-1\u3092\u7b26\u53f7\u306a\u3057\u6574\u6570\u3068\u3057\u3066\u89e3\u91c8\u3057\u305f\u5024\uff09\u3067\u3059<\/li>\n\n\n\n<li>\u6bd4\u8f03\u65b9\u6cd5\uff1a\u5fc5\u305a <code>!=<\/code> \u307e\u305f\u306f <code>==<\/code> \u3092\u4f7f\u7528\u3057\u3066\u6bd4\u8f03\u3057\u307e\u3059<\/li>\n\n\n\n<li>\u6761\u4ef6\u5206\u5c90\uff1a\u691c\u7d22\u7d50\u679c\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306e\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u5b9f\u88c5\u3057\u307e\u3059<\/li>\n<\/ol>\n\n\n\n<p>\u4e00\u822c\u7684\u306a\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n<div id=\"id-dd2b9ca2-6cd0-4c54-8b76-fe01c232f541\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u72b6\u6cc1<\/th><th>\u63a8\u5968\u3055\u308c\u308b\u4f7f\u3044\u65b9<\/th><th>\u907f\u3051\u308b\u3079\u304d\u4f7f\u3044\u65b9<\/th><\/tr><\/thead><tbody><tr><td>\u691c\u7d22\u7d50\u679c\u306e\u5224\u5b9a<\/td><td><code>if (pos != string::npos)<\/code><\/td><td><code>if (pos &gt;= 0)<\/code><\/td><\/tr><tr><td>\u521d\u671f\u5024\u306e\u8a2d\u5b9a<\/td><td><code>size_t pos = string::npos;<\/code><\/td><td><code>int pos = -1;<\/code><\/td><\/tr><tr><td>\u7bc4\u56f2\u30c1\u30a7\u30c3\u30af<\/td><td><code>if (pos &lt; str.length())<\/code><\/td><td><code>if (pos &gt;= 0 &amp;&amp; pos &lt; str.length())<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u306e\u57fa\u790e\u77e5\u8b58\u3092\u8e0f\u307e\u3048\u308b\u3053\u3068\u3067\u3001string::find \u3092\u4f7f\u7528\u3057\u305f\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u6587\u5b57\u5217\u691c\u7d22\u51e6\u7406\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u57fa\u672c\u3092\u6d3b\u304b\u3057\u305f\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">string::find \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<p>\u5b9f\u969b\u306e\u958b\u767a\u73fe\u5834\u3067\u306f\u3001\u5358\u7d14\u306a\u6587\u5b57\u5217\u691c\u7d22\u3060\u3051\u3067\u306a\u304f\u3001\u3088\u308a\u8907\u96d1\u306a\u8981\u4ef6\u306b\u5bfe\u5fdc\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001string::find\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">\u90e8\u5206\u6587\u5b57\u5217\u306e\u691c\u7d22\u3067\u5931\u6557\u3057\u306a\u3044\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>\u90e8\u5206\u6587\u5b57\u5217\u306e\u691c\u7d22\u306f\u5358\u7d14\u306a\u64cd\u4f5c\u306b\u898b\u3048\u307e\u3059\u304c\u3001\u5b9f\u969b\u306b\u306f\u69d8\u3005\u306a\u8003\u616e\u4e8b\u9805\u304c\u3042\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u4fe1\u983c\u6027\u306e\u9ad8\u3044\u691c\u7d22\u3092\u5b9f\u88c5\u3059\u308b\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\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=\"\">#include &lt;iostream&gt;\n#include &lt;string&gt;\n#include &lt;vector&gt;\n\nclass StringSearcher {\nprivate:\n    std::string text;\n\npublic:\n    StringSearcher(const std::string&amp; input) : text(input) {}\n\n    \/\/ \u8907\u6570\u306e\u51fa\u73fe\u4f4d\u7f6e\u3092\u3059\u3079\u3066\u53d6\u5f97\n    std::vector&lt;size_t&gt; findAll(const std::string&amp; pattern) {\n        std::vector&lt;size_t&gt; positions;\n        size_t pos = 0;\n\n        \/\/ \u6587\u5b57\u5217\u304c\u7a7a\u3067\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\n        if (pattern.empty() || text.empty()) {\n            return positions;\n        }\n\n        \/\/ \u3059\u3079\u3066\u306e\u51fa\u73fe\u4f4d\u7f6e\u3092\u691c\u7d22\n        while ((pos = text.find(pattern, pos)) != std::string::npos) {\n            positions.push_back(pos);\n            pos += 1; \/\/ \u30d1\u30bf\u30fc\u30f3\u306e\u9577\u3055\u5206\u305a\u3089\u3059\u3053\u3068\u3082\u53ef\u80fd: pos += pattern.length();\n        }\n\n        return positions;\n    }\n\n    \/\/ \u5883\u754c\u30c1\u30a7\u30c3\u30af\u4ed8\u304d\u306e\u691c\u7d22\n    bool findWithBoundaryCheck(const std::string&amp; pattern, size_t&amp; position) {\n        \/\/ \u57fa\u672c\u7684\u306a\u5165\u529b\u691c\u8a3c\n        if (pattern.empty() || text.empty() || pattern.length() &gt; text.length()) {\n            return false;\n        }\n\n        position = text.find(pattern);\n\n        \/\/ \u898b\u3064\u304b\u3063\u305f\u4f4d\u7f6e\u304c\u6709\u52b9\u304b\u78ba\u8a8d\n        if (position != std::string::npos) {\n            \/\/ \u5fc5\u8981\u306b\u5fdc\u3058\u3066\u8ffd\u52a0\u306e\u5883\u754c\u6761\u4ef6\u3092\u30c1\u30a7\u30c3\u30af\n            if (position + pattern.length() &lt;= text.length()) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n};\n\n\/\/ \u4f7f\u7528\u4f8b\nint main() {\n    StringSearcher searcher(\"Hello C++ World. Hello C++ Programming!\");\n\n    \/\/ \u3059\u3079\u3066\u306e\"Hello\"\u306e\u4f4d\u7f6e\u3092\u53d6\u5f97\n    auto positions = searcher.findAll(\"Hello\");\n    std::cout &lt;&lt; \"Found 'Hello' at positions: \";\n    for (const auto&amp; pos : positions) {\n        std::cout &lt;&lt; pos &lt;&lt; \" \";\n    }\n    std::cout &lt;&lt; std::endl;\n\n    \/\/ \u5883\u754c\u30c1\u30a7\u30c3\u30af\u4ed8\u304d\u306e\u691c\u7d22\n    size_t position;\n    if (searcher.findWithBoundaryCheck(\"C++\", position)) {\n        std::cout &lt;&lt; \"Found 'C++' at safe position: \" &lt;&lt; position &lt;&lt; std::endl;\n    }\n\n    return 0;\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5165\u529b\u306e\u691c\u8a3c<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7a7a\u6587\u5b57\u5217\u306e\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u30d1\u30bf\u30fc\u30f3\u9577\u3068\u5bfe\u8c61\u6587\u5b57\u5217\u9577\u306e\u6bd4\u8f03<\/li>\n\n\n\n<li>\u4e0d\u6b63\u306a\u6587\u5b57\u306e\u30c1\u30a7\u30c3\u30af<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5883\u754c\u6761\u4ef6\u306e\u8003\u616e<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u691c\u7d22\u958b\u59cb\u4f4d\u7f6e\u306e\u59a5\u5f53\u6027\u78ba\u8a8d<\/li>\n\n\n\n<li>\u691c\u7d22\u7d50\u679c\u306e\u7bc4\u56f2\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u30d0\u30c3\u30d5\u30a1\u30aa\u30fc\u30d0\u30fc\u30d5\u30ed\u30fc\u306e\u9632\u6b62<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u51e6\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u30a8\u30e9\u30fc\u5831\u544a\u30e1\u30ab\u30cb\u30ba\u30e0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u5931\u6557\u6642\u306e\u4ee3\u66ff\u51e6\u7406\u306e\u63d0\u4f9b<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u306a\u3044\u691c\u7d22\u3092\u5b9f\u73fe\u3059\u308b\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5b9f\u969b\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u306a\u3044\u691c\u7d22\u304c\u5fc5\u8981\u306b\u306a\u308b\u3053\u3068\u304c\u3088\u304f\u3042\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u305d\u306e\u5b9f\u88c5\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=\"\">#include &lt;iostream&gt;\n#include &lt;string&gt;\n#include &lt;algorithm&gt;\n#include &lt;cctype&gt;\n\nclass CaseInsensitiveSearcher {\nprivate:\n    \/\/ \u6587\u5b57\u5217\u3092\u5c0f\u6587\u5b57\u306b\u5909\u63db\u3059\u308b\u88dc\u52a9\u95a2\u6570\n    static std::string toLower(std::string s) {\n        std::transform(s.begin(), s.end(), s.begin(),\n                      [](unsigned char c){ return std::tolower(c); });\n        return s;\n    }\n\npublic:\n    \/\/ \u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u306a\u3044\u691c\u7d22\n    static size_t findCaseInsensitive(const std::string&amp; text, \n                                    const std::string&amp; pattern) {\n        std::string lowerText = toLower(text);\n        std::string lowerPattern = toLower(pattern);\n\n        return lowerText.find(lowerPattern);\n    }\n\n    \/\/ \u90e8\u5206\u4e00\u81f4\u306e\u691c\u8a3c\uff08\u5358\u8a9e\u5883\u754c\u3092\u8003\u616e\uff09\n    static bool containsWord(const std::string&amp; text, \n                           const std::string&amp; word) {\n        std::string lowerText = toLower(text);\n        std::string lowerWord = toLower(word);\n\n        size_t pos = lowerText.find(lowerWord);\n        while (pos != std::string::npos) {\n            \/\/ \u5358\u8a9e\u306e\u524d\u5f8c\u304c\u5358\u8a9e\u306e\u4e00\u90e8\u3067\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\n            bool validStart = (pos == 0 || !std::isalnum(lowerText[pos - 1]));\n            bool validEnd = (pos + word.length() == text.length() || \n                           !std::isalnum(lowerText[pos + word.length()]));\n\n            if (validStart &amp;&amp; validEnd) {\n                return true;\n            }\n\n            pos = lowerText.find(lowerWord, pos + 1);\n        }\n\n        return false;\n    }\n};\n\n\/\/ \u4f7f\u7528\u4f8b\nint main() {\n    std::string text = \"Welcome to C++ Programming! CPP is awesome.\";\n\n    \/\/ \u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u306a\u3044\u691c\u7d22\n    size_t pos = CaseInsensitiveSearcher::findCaseInsensitive(text, \"cpp\");\n    if (pos != std::string::npos) {\n        std::cout &lt;&lt; \"Found 'cpp' at position: \" &lt;&lt; pos &lt;&lt; std::endl;\n    }\n\n    \/\/ \u5358\u8a9e\u3068\u3057\u3066\u306e\u691c\u7d22\n    bool containsCpp = CaseInsensitiveSearcher::containsWord(text, \"cpp\");\n    std::cout &lt;&lt; \"Contains 'cpp' as a word: \" &lt;&lt; (containsCpp ? \"yes\" : \"no\") &lt;&lt; std::endl;\n\n    return 0;\n}<\/pre>\n\n\n\n<p>\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u306a\u3044\u691c\u7d22\u3092\u5b9f\u88c5\u3059\u308b\u969b\u306e\u6ce8\u610f\u70b9\uff1a<\/p>\n\n\n<div id=\"id-87ac4dbe-79f9-4d05-a7dc-859ca4dd0894\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8003\u616e\u4e8b\u9805<\/th><th>\u5bfe\u5fdc\u65b9\u6cd5<\/th><th>\u6ce8\u610f\u70b9<\/th><\/tr><\/thead><tbody><tr><td>\u6587\u5b57\u5217\u5909\u63db<\/td><td><code>std::transform<\/code> + <code>std::tolower<\/code><\/td><td>\u30ed\u30b1\u30fc\u30eb\u4f9d\u5b58\u306e\u554f\u984c\u306b\u6ce8\u610f<\/td><\/tr><tr><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/td><td>\u5fc5\u8981\u306a\u90e8\u5206\u306e\u307f\u5909\u63db<\/td><td>\u5927\u898f\u6a21\u30c6\u30ad\u30b9\u30c8\u3067\u306e\u6700\u9069\u5316<\/td><\/tr><tr><td>\u30e1\u30e2\u30ea\u4f7f\u7528<\/td><td>\u4e00\u6642\u6587\u5b57\u5217\u306e\u6700\u5c0f\u5316<\/td><td>\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30d3\u30e5\u30fc\u306e\u4f7f\u7528<\/td><\/tr><tr><td>Unicode\u5bfe\u5fdc<\/td><td>ICU\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u4f7f\u7528\u691c\u8a0e<\/td><td>\u8a00\u8a9e\u56fa\u6709\u306e\u898f\u5247\u306b\u6ce8\u610f<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5805\u7262\u3067\u67d4\u8edf\u306a\u6587\u5b57\u5217\u691c\u7d22\u6a5f\u80fd\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u5b9f\u88c5\u3092\u3055\u3089\u306b\u6700\u9069\u5316\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-6\">string::find \u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/h2>\n\n\n\n<p>string::find\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306f\u3001\u7279\u306b\u5927\u898f\u6a21\u306a\u30c6\u30ad\u30b9\u30c8\u51e6\u7406\u3084\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30b7\u30b9\u30c6\u30e0\u306b\u304a\u3044\u3066\u91cd\u8981\u306a\u8003\u616e\u4e8b\u9805\u3068\u306a\u308a\u307e\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30e1\u30e2\u30ea\u52b9\u7387\u3068\u51e6\u7406\u901f\u5ea6\u306e\u4e21\u9762\u304b\u3089\u306e\u6700\u9069\u5316\u624b\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u30e1\u30e2\u30ea\u52b9\u7387\u3092\u8003\u616e\u3057\u305f\u6587\u5b57\u5217\u691c\u7d22\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u6587\u5b57\u5217\u691c\u7d22\u3092\u5b9f\u88c5\u3059\u308b\u306b\u306f\u3001\u4e0d\u5fc5\u8981\u306a\u30b3\u30d4\u30fc\u3092\u907f\u3051\u3001\u9069\u5207\u306a\u30e1\u30e2\u30ea\u7ba1\u7406\u3092\u884c\u3046\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=\"\">#include &lt;iostream&gt;\n#include &lt;string&gt;\n#include &lt;string_view&gt;\n#include &lt;vector&gt;\n#include &lt;chrono&gt;\n\nclass OptimizedStringSearcher {\nprivate:\n    std::string_view text;  \/\/ string_view\u3092\u4f7f\u7528\u3057\u3066\u30e1\u30e2\u30ea\u52b9\u7387\u3092\u6539\u5584\n\npublic:\n    OptimizedStringSearcher(const std::string&amp; input) : text(input) {}\n\n    \/\/ string_view\u3092\u6d3b\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u691c\u7d22\n    std::vector&lt;size_t&gt; findAllOptimized(std::string_view pattern) const {\n        std::vector&lt;size_t&gt; positions;\n        positions.reserve(10);  \/\/ \u4e88\u60f3\u3055\u308c\u308b\u7d50\u679c\u6570\u3067\u4e88\u7d04\n\n        size_t pos = 0;\n        while ((pos = text.find(pattern, pos)) != std::string_view::npos) {\n            positions.push_back(pos);\n            pos += 1;\n        }\n\n        return positions;\n    }\n\n    \/\/ \u30e1\u30e2\u30ea\u30d7\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u305f\u691c\u7d22\u7d50\u679c\u306e\u683c\u7d0d\n    template&lt;size_t PoolSize = 1024&gt;\n    class SearchResultPool {\n    private:\n        size_t positions[PoolSize];\n        size_t count = 0;\n\n    public:\n        void addPosition(size_t pos) {\n            if (count &lt; PoolSize) {\n                positions[count++] = pos;\n            }\n        }\n\n        \/\/ \u7d50\u679c\u306e\u53d6\u5f97\uff08\u5fc5\u8981\u306a\u5834\u5408\u306e\u307f\u30b3\u30d4\u30fc\uff09\n        std::vector&lt;size_t&gt; getResults() const {\n            return std::vector&lt;size_t&gt;(positions, positions + count);\n        }\n    };\n};\n\n\/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8a08\u6e2c\u7528\u306e\u88dc\u52a9\u95a2\u6570\ntemplate&lt;typename Func&gt;\nlong long measureExecutionTime(Func&amp;&amp; func) {\n    auto start = std::chrono::high_resolution_clock::now();\n    func();\n    auto end = std::chrono::high_resolution_clock::now();\n    return std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(end - start).count();\n}\n\nint main() {\n    \/\/ \u5927\u304d\u306a\u30c6\u30ad\u30b9\u30c8\u306e\u751f\u6210\n    std::string largeText(1000000, 'a');\n    largeText += \"pattern\";\n\n    OptimizedStringSearcher searcher(largeText);\n    std::string_view pattern = \"pattern\";\n\n    \/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8a08\u6e2c\n    auto duration = measureExecutionTime([&amp;]() {\n        auto results = searcher.findAllOptimized(pattern);\n        std::cout &lt;&lt; \"Found \" &lt;&lt; results.size() &lt;&lt; \" matches\" &lt;&lt; std::endl;\n    });\n\n    std::cout &lt;&lt; \"Execution time: \" &lt;&lt; duration &lt;&lt; \" microseconds\" &lt;&lt; std::endl;\n\n    return 0;\n}<\/pre>\n\n\n\n<p>\u30e1\u30e2\u30ea\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n<div id=\"id-cd594be5-6724-4a32-9e2f-c03431303476\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6700\u9069\u5316\u6280\u6cd5<\/th><th>\u52b9\u679c<\/th><th>\u9069\u7528\u30b7\u30fc\u30f3<\/th><\/tr><\/thead><tbody><tr><td>string_view\u4f7f\u7528<\/td><td>\u30b3\u30d4\u30fc\u524a\u6e1b<\/td><td>\u8aad\u307f\u53d6\u308a\u5c02\u7528\u306e\u6587\u5b57\u5217\u51e6\u7406<\/td><\/tr><tr><td>\u30e1\u30e2\u30ea\u30d7\u30fc\u30eb<\/td><td>\u30e1\u30e2\u30ea\u78ba\u4fdd\u30b3\u30b9\u30c8\u524a\u6e1b<\/td><td>\u983b\u7e41\u306a\u691c\u7d22\u7d50\u679c\u306e\u4fdd\u5b58<\/td><\/tr><tr><td>\u4e88\u7d04\u30b5\u30a4\u30ba\u6307\u5b9a<\/td><td>\u518d\u78ba\u4fdd\u56de\u6570\u306e\u524a\u6e1b<\/td><td>\u7d50\u679c\u6570\u304c\u4e88\u6e2c\u53ef\u80fd\u306a\u5834\u5408<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u5927\u898f\u6a21\u30c6\u30ad\u30b9\u30c8\u51e6\u7406\u3067\u306e\u6700\u9069\u5316\u624b\u6cd5<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306a\u30c6\u30ad\u30b9\u30c8\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\u3059\u308b\u306b\u306f\u3001\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u9078\u629e\u3068\u30e1\u30e2\u30ea\u7ba1\u7406\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=\"\">#include &lt;iostream&gt;\n#include &lt;string&gt;\n#include &lt;memory&gt;\n#include &lt;algorithm&gt;\n\nclass LargeTextProcessor {\nprivate:\n    \/\/ \u30c1\u30e3\u30f3\u30af\u5358\u4f4d\u3067\u306e\u51e6\u7406\u306e\u305f\u3081\u306e\u69cb\u9020\u4f53\n    struct TextChunk {\n        static constexpr size_t CHUNK_SIZE = 1024 * 1024; \/\/ 1MB\n        std::unique_ptr&lt;char[]&gt; data;\n        size_t size;\n\n        TextChunk() : data(std::make_unique&lt;char[]&gt;(CHUNK_SIZE)), size(0) {}\n    };\n\n    std::vector&lt;TextChunk&gt; chunks;\n\npublic:\n    \/\/ \u5927\u898f\u6a21\u30c6\u30ad\u30b9\u30c8\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406\n    void processLargeText(const std::string&amp; pattern,\n                         std::function&lt;void(size_t)&gt; matchCallback) {\n        const size_t patternLength = pattern.length();\n        size_t globalOffset = 0;\n\n        for (const auto&amp; chunk : chunks) {\n            \/\/ Boyer-Moore-Horspool \u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u7c21\u7565\u5b9f\u88c5\n            size_t skip[256];\n            std::fill_n(skip, 256, patternLength);\n\n            for (size_t i = 0; i &lt; patternLength - 1; i++) {\n                skip[static_cast&lt;unsigned char&gt;(pattern[i])] = patternLength - 1 - i;\n            }\n\n            size_t pos = 0;\n            while (pos &lt;= chunk.size - patternLength) {\n                if (std::equal(pattern.begin(), pattern.end(),\n                             chunk.data.get() + pos)) {\n                    matchCallback(globalOffset + pos);\n                }\n                pos += skip[static_cast&lt;unsigned char&gt;(\n                    chunk.data[pos + patternLength - 1])];\n            }\n\n            globalOffset += chunk.size;\n        }\n    }\n\n    \/\/ \u30e1\u30e2\u30ea\u30de\u30c3\u30d4\u30f3\u30b0\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u691c\u7d22\n    class MemoryMappedSearcher {\n    private:\n        \/\/ \u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u4f9d\u5b58\u306e\u30e1\u30e2\u30ea\u30de\u30c3\u30d4\u30f3\u30b0\u5b9f\u88c5\n        \/\/ Windows: CreateFileMapping\/MapViewOfFile\n        \/\/ POSIX: mmap\n    };\n};\n\n\/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\nclass SearchOptimizer {\npublic:\n    static void optimizeForTarget(const std::string&amp; text, size_t targetSize) {\n        if (targetSize &lt; 1024) {\n            \/\/ \u5c0f\u898f\u6a21\u30c6\u30ad\u30b9\u30c8\u5411\u3051\u6700\u9069\u5316\n            \/\/ \u901a\u5e38\u306estring::find\u4f7f\u7528\n        } else if (targetSize &lt; 1024 * 1024) {\n            \/\/ \u4e2d\u898f\u6a21\u30c6\u30ad\u30b9\u30c8\u5411\u3051\u6700\u9069\u5316\n            \/\/ string_view\u3068\u30e1\u30e2\u30ea\u30d7\u30fc\u30eb\u4f7f\u7528\n        } else {\n            \/\/ \u5927\u898f\u6a21\u30c6\u30ad\u30b9\u30c8\u5411\u3051\u6700\u9069\u5316\n            \/\/ \u30c1\u30e3\u30f3\u30af\u51e6\u7406\u3068\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u9078\u629e\n        }\n    }\n\n    static void benchmarkPerformance() {\n        \/\/ \u30d9\u30f3\u30c1\u30de\u30fc\u30af\u5b9f\u884c\u3068\u7d50\u679c\u30ec\u30dd\u30fc\u30c8\n        std::vector&lt;size_t&gt; textSizes = {1024, 1024*1024, 10*1024*1024};\n        for (auto size : textSizes) {\n            \/\/ \u5404\u30b5\u30a4\u30ba\u3067\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6e2c\u5b9a\n        }\n    }\n};<\/pre>\n\n\n\n<p>\u6700\u9069\u5316\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u9078\u629e<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5c0f\u898f\u6a21\u30c6\u30ad\u30b9\u30c8\uff1a\u6a19\u6e96\u306estring::find<\/li>\n\n\n\n<li>\u4e2d\u898f\u6a21\u30c6\u30ad\u30b9\u30c8\uff1aBoyer-Moore-Horspool<\/li>\n\n\n\n<li>\u5927\u898f\u6a21\u30c6\u30ad\u30b9\u30c8\uff1a\u4e26\u5217\u51e6\u7406\u3084\u30e1\u30e2\u30ea\u30de\u30c3\u30d4\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u7ba1\u7406\u6226\u7565<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306b\u3088\u308b\u5927\u898f\u6a21\u30c6\u30ad\u30b9\u30c8\u306e\u5206\u5272<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u30de\u30c3\u30d4\u30f3\u30b0\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u52b9\u7387\u306e\u8003\u616e<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9f\u884c\u6642\u9593\u306e\u6e2c\u5b9a<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u8ffd\u8de1<\/li>\n\n\n\n<li>\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306e\u7279\u5b9a<\/li>\n<\/ul>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u76ee\u5b89\uff1a<\/p>\n\n\n<div id=\"id-241ac158-9732-474b-9bcc-c9f27238bd16\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30c6\u30ad\u30b9\u30c8\u30b5\u30a4\u30ba<\/th><th>\u63a8\u5968\u30a2\u30d7\u30ed\u30fc\u30c1<\/th><th>\u671f\u5f85\u3055\u308c\u308b\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/th><\/tr><\/thead><tbody><tr><td>&lt;1KB<\/td><td>\u6a19\u6e96string::find<\/td><td>&lt; 1ms<\/td><\/tr><tr><td>1KB-1MB<\/td><td>string_view + \u30e1\u30e2\u30ea\u30d7\u30fc\u30eb<\/td><td>&lt; 10ms<\/td><\/tr><tr><td>&gt;1MB<\/td><td>\u30c1\u30e3\u30f3\u30af\u51e6\u7406 + \u9ad8\u5ea6\u306a\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0<\/td><td>\u30b5\u30a4\u30ba\u306b\u5fdc\u3058\u3066\u7dda\u5f62\u5897\u52a0<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\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\u5927\u898f\u6a21\u306a\u30c6\u30ad\u30b9\u30c8\u51e6\u7406\u3067\u3082\u52b9\u7387\u7684\u306a\u6587\u5b57\u5217\u691c\u7d22\u3092\u5b9f\u73fe\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u624b\u6cd5\u3092\u5b9f\u969b\u306e\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u9069\u7528\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-9\">string::find \u306e\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u4f8b<\/h2>\n\n\n\n<p>string::find\u306f\u5b9f\u969b\u306e\u958b\u767a\u73fe\u5834\u3067\u983b\u7e41\u306b\u4f7f\u7528\u3055\u308c\u308b\u6a5f\u80fd\u3067\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u52d9\u3067\u906d\u9047\u3059\u308b\u5177\u4f53\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3068\u305d\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u89e3\u6790\u3067\u306e\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u89e3\u6790\u306f\u3001\u591a\u304f\u306e\u30b7\u30b9\u30c6\u30e0\u3067\u5fc5\u8981\u3068\u3055\u308c\u308b\u91cd\u8981\u306a\u6a5f\u80fd\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001string::find\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u30ed\u30b0\u89e3\u6790\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=\"\">#include &lt;iostream&gt;\n#include &lt;fstream&gt;\n#include &lt;string&gt;\n#include &lt;vector&gt;\n#include &lt;chrono&gt;\n#include &lt;iomanip&gt;\n\nclass LogAnalyzer {\npublic:\n    struct LogEntry {\n        std::string timestamp;\n        std::string level;\n        std::string message;\n    };\n\n    class LogFilter {\n    private:\n        std::string level;\n        std::string keyword;\n\n    public:\n        LogFilter(const std::string&amp; logLevel, const std::string&amp; searchKeyword)\n            : level(logLevel), keyword(searchKeyword) {}\n\n        bool matches(const LogEntry&amp; entry) const {\n            return (level.empty() || entry.level == level) &amp;&amp;\n                   (keyword.empty() || entry.message.find(keyword) != std::string::npos);\n        }\n    };\n\n    static LogEntry parseLine(const std::string&amp; line) {\n        LogEntry entry;\n        size_t pos = 0;\n\n        \/\/ \u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u306e\u62bd\u51fa\n        pos = line.find('[');\n        if (pos != std::string::npos) {\n            size_t endPos = line.find(']', pos);\n            if (endPos != std::string::npos) {\n                entry.timestamp = line.substr(pos + 1, endPos - pos - 1);\n                pos = endPos + 1;\n            }\n        }\n\n        \/\/ \u30ed\u30b0\u30ec\u30d9\u30eb\u306e\u62bd\u51fa\n        pos = line.find('[', pos);\n        if (pos != std::string::npos) {\n            size_t endPos = line.find(']', pos);\n            if (endPos != std::string::npos) {\n                entry.level = line.substr(pos + 1, endPos - pos - 1);\n                pos = endPos + 2; \/\/ \u30b9\u30da\u30fc\u30b9\u3092\u30b9\u30ad\u30c3\u30d7\n            }\n        }\n\n        \/\/ \u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u62bd\u51fa\n        if (pos &lt; line.length()) {\n            entry.message = line.substr(pos);\n        }\n\n        return entry;\n    }\n\n    std::vector&lt;LogEntry&gt; analyze(const std::string&amp; filename, const LogFilter&amp; filter) {\n        std::vector&lt;LogEntry&gt; matchedEntries;\n        std::ifstream file(filename);\n        std::string line;\n\n        while (std::getline(file, line)) {\n            auto entry = parseLine(line);\n            if (filter.matches(entry)) {\n                matchedEntries.push_back(entry);\n            }\n        }\n\n        return matchedEntries;\n    }\n};\n\n\/\/ \u4f7f\u7528\u4f8b\nint main() {\n    \/\/ \u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u4f8b\n    std::ofstream logFile(\"app.log\");\n    logFile &lt;&lt; \"[2024-01-09 10:15:30][INFO] Application started\\n\"\n            &lt;&lt; \"[2024-01-09 10:15:31][ERROR] Failed to connect to database\\n\"\n            &lt;&lt; \"[2024-01-09 10:15:32][INFO] Retry connection...\\n\"\n            &lt;&lt; \"[2024-01-09 10:15:33][INFO] Connection established\\n\";\n    logFile.close();\n\n    LogAnalyzer analyzer;\n    LogAnalyzer::LogFilter filter(\"ERROR\", \"database\");\n\n    auto results = analyzer.analyze(\"app.log\", filter);\n\n    for (const auto&amp; entry : results) {\n        std::cout &lt;&lt; \"Found error log: \" &lt;&lt; entry.timestamp \n                 &lt;&lt; \" - \" &lt;&lt; entry.message &lt;&lt; std::endl;\n    }\n\n    return 0;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30fc\u30b9\u51e6\u7406\u3067\u306e\u4f7f\u3044\u65b9<\/h3>\n\n\n\n<p>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30fc\u30b9\u51e6\u7406\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u3067\u3088\u304f\u5fc5\u8981\u3068\u306a\u308b\u6a5f\u80fd\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001string::find\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u30d1\u30fc\u30b5\u30fc\u306e\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=\"\">#include &lt;iostream&gt;\n#include &lt;fstream&gt;\n#include &lt;string&gt;\n#include &lt;map&gt;\n#include &lt;optional&gt;\n\nclass ConfigParser {\npublic:\n    class Section {\n    private:\n        std::map&lt;std::string, std::string&gt; values;\n\n    public:\n        void setValue(const std::string&amp; key, const std::string&amp; value) {\n            values[key] = value;\n        }\n\n        std::optional&lt;std::string&gt; getValue(const std::string&amp; key) const {\n            auto it = values.find(key);\n            if (it != values.end()) {\n                return it-&gt;second;\n            }\n            return std::nullopt;\n        }\n    };\n\nprivate:\n    std::map&lt;std::string, Section&gt; sections;\n\n    static std::string trim(const std::string&amp; str) {\n        size_t first = str.find_first_not_of(\" \\t\");\n        if (first == std::string::npos) return \"\";\n        size_t last = str.find_last_not_of(\" \\t\");\n        return str.substr(first, last - first + 1);\n    }\n\npublic:\n    void parse(const std::string&amp; filename) {\n        std::ifstream file(filename);\n        std::string line;\n        Section* currentSection = nullptr;\n\n        while (std::getline(file, line)) {\n            line = trim(line);\n\n            if (line.empty() || line[0] == ';' || line[0] == '#') {\n                continue; \/\/ \u30b3\u30e1\u30f3\u30c8\u307e\u305f\u306f\u7a7a\u884c\u3092\u30b9\u30ad\u30c3\u30d7\n            }\n\n            if (line[0] == '[') {\n                size_t end = line.find(']');\n                if (end != std::string::npos) {\n                    std::string sectionName = line.substr(1, end - 1);\n                    currentSection = &amp;sections[sectionName];\n                }\n            } else {\n                size_t equals = line.find('=');\n                if (equals != std::string::npos &amp;&amp; currentSection) {\n                    std::string key = trim(line.substr(0, equals));\n                    std::string value = trim(line.substr(equals + 1));\n                    currentSection-&gt;setValue(key, value);\n                }\n            }\n        }\n    }\n\n    std::optional&lt;std::string&gt; getValue(const std::string&amp; section,\n                                      const std::string&amp; key) const {\n        auto sectionIt = sections.find(section);\n        if (sectionIt != sections.end()) {\n            return sectionIt-&gt;second.getValue(key);\n        }\n        return std::nullopt;\n    }\n};\n\n\/\/ \u4f7f\u7528\u4f8b\nint main() {\n    \/\/ \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u4f8b\n    std::ofstream configFile(\"config.ini\");\n    configFile &lt;&lt; \"[Database]\\n\"\n               &lt;&lt; \"host = localhost\\n\"\n               &lt;&lt; \"port = 5432\\n\"\n               &lt;&lt; \"name = myapp\\n\\n\"\n               &lt;&lt; \"[Application]\\n\"\n               &lt;&lt; \"debug = true\\n\"\n               &lt;&lt; \"log_level = INFO\\n\";\n    configFile.close();\n\n    ConfigParser parser;\n    parser.parse(\"config.ini\");\n\n    \/\/ \u8a2d\u5b9a\u5024\u306e\u53d6\u5f97\u3068\u4f7f\u7528\n    if (auto dbHost = parser.getValue(\"Database\", \"host\")) {\n        std::cout &lt;&lt; \"Database host: \" &lt;&lt; *dbHost &lt;&lt; std::endl;\n    }\n\n    if (auto logLevel = parser.getValue(\"Application\", \"log_level\")) {\n        std::cout &lt;&lt; \"Log level: \" &lt;&lt; *logLevel &lt;&lt; std::endl;\n    }\n\n    return 0;\n}<\/pre>\n\n\n\n<p>\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u306b\u304a\u3051\u308b\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n<div id=\"id-b24a78da-e930-4c5a-a259-5034e666bf11\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9<\/th><th>\u91cd\u8981\u306a\u8003\u616e\u70b9<\/th><th>\u5b9f\u88c5\u306e\u30b3\u30c4<\/th><\/tr><\/thead><tbody><tr><td>\u30ed\u30b0\u89e3\u6790<\/td><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/td><td>\u30b9\u30c8\u30ea\u30fc\u30e0\u51e6\u7406\u306e\u6d3b\u7528<\/td><\/tr><tr><td>\u8a2d\u5b9a\u30d1\u30fc\u30b9<\/td><td>\u30a8\u30e9\u30fc\u51e6\u7406<\/td><td>\u5805\u7262\u306a\u5165\u529b\u691c\u8a3c<\/td><\/tr><tr><td>\u5927\u898f\u6a21\u30d5\u30a1\u30a4\u30eb<\/td><td>\u30e1\u30e2\u30ea\u7ba1\u7406<\/td><td>\u30c1\u30e3\u30f3\u30af\u8aad\u307f\u8fbc\u307f<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u4ee5\u4e0b\u306e\u7279\u5fb4\u3092\u6301\u3063\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u6b63\u306a\u5165\u529b\u306e\u691c\u51fa<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30a8\u30e9\u30fc\u5831\u544a<\/li>\n\n\n\n<li>\u56de\u5fa9\u53ef\u80fd\u306a\u30a8\u30e9\u30fc\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8003\u616e<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u52b9\u7387\u7684\u306a\u30e1\u30e2\u30ea\u4f7f\u7528<\/li>\n\n\n\n<li>\u6700\u9069\u306a\u691c\u7d22\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4fdd\u5b88\u6027<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e2\u30b8\u30e5\u30e9\u30fc\u8a2d\u8a08<\/li>\n\n\n\n<li>\u62e1\u5f35\u53ef\u80fd\u306a\u69cb\u9020<\/li>\n\n\n\n<li>\u660e\u78ba\u306a\u30a8\u30e9\u30fc\u5831\u544a<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u8df5\u7684\u306a\u4f8b\u3092\u53c2\u8003\u306b\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067string::find\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001string::find\u306e\u4ee3\u66ff\u624b\u6bb5\u3068\u306e\u6bd4\u8f03\u3092\u884c\u3044\u3001\u9069\u5207\u306a\u9078\u629e\u57fa\u6e96\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">string::find \u306e\u4ee3\u66ff\u624b\u6bb5\u3068\u6bd4\u8f03<\/h2>\n\n\n\n<p>\u6587\u5b57\u5217\u691c\u7d22\u306b\u306f\u69d8\u3005\u306a\u30a2\u30d7\u30ed\u30fc\u30c1\u304c\u5b58\u5728\u3057\u307e\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001string::find\u3068\u4ed6\u306e\u4e3b\u8981\u306a\u691c\u7d22\u624b\u6cd5\u3092\u6bd4\u8f03\u3057\u3001\u305d\u308c\u305e\u308c\u306e\u7279\u5fb4\u3068\u9069\u5207\u306a\u4f7f\u7528\u5834\u9762\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u6b63\u898f\u8868\u73fe\u3068\u306e\u4fbf\u5229\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<p>\u6b63\u898f\u8868\u73fe\u306f\u67d4\u8edf\u306a\u6587\u5b57\u5217\u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u30f3\u30b0\u3092\u63d0\u4f9b\u3057\u307e\u3059\u304c\u3001string::find\u3068\u6bd4\u3079\u3066\u8907\u96d1\u3055\u3068\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9\u304c\u5897\u52a0\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u4e21\u8005\u306e\u6bd4\u8f03\u3068\u4f7f\u3044\u5206\u3051\u306e\u30dd\u30a4\u30f3\u30c8\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=\"\">#include &lt;iostream&gt;\n#include &lt;string&gt;\n#include &lt;regex&gt;\n#include &lt;chrono&gt;\n\nclass StringMatcher {\npublic:\n    \/\/ string::find\u3092\u4f7f\u7528\u3057\u305f\u691c\u7d22\n    static bool findSubstring(const std::string&amp; text, const std::string&amp; pattern) {\n        return text.find(pattern) != std::string::npos;\n    }\n\n    \/\/ \u6b63\u898f\u8868\u73fe\u3092\u4f7f\u7528\u3057\u305f\u691c\u7d22\n    static bool findRegex(const std::string&amp; text, const std::string&amp; pattern) {\n        try {\n            std::regex re(pattern);\n            return std::regex_search(text, re);\n        } catch (const std::regex_error&amp; e) {\n            std::cerr &lt;&lt; \"\u6b63\u898f\u8868\u73fe\u30a8\u30e9\u30fc: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n            return false;\n        }\n    }\n\n    \/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6bd4\u8f03\u7528\u306e\u30d9\u30f3\u30c1\u30de\u30fc\u30af\n    static void compareMethods() {\n        std::string text = \"This is a test string containing example@email.com and https:\/\/example.com\";\n\n        \/\/ \u5358\u7d14\u306a\u6587\u5b57\u5217\u691c\u7d22\n        auto t1 = measureTime([&amp;]() {\n            return findSubstring(text, \"example\");\n        });\n\n        \/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u30d1\u30bf\u30fc\u30f3\u306e\u691c\u7d22\n        auto t2 = measureTime([&amp;]() {\n            return findRegex(text, R\"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})\");\n        });\n\n        std::cout &lt;&lt; \"string::find \u5b9f\u884c\u6642\u9593: \" &lt;&lt; t1 &lt;&lt; \"\u03bcs\\n\";\n        std::cout &lt;&lt; \"\u6b63\u898f\u8868\u73fe \u5b9f\u884c\u6642\u9593: \" &lt;&lt; t2 &lt;&lt; \"\u03bcs\\n\";\n    }\n\nprivate:\n    template&lt;typename Func&gt;\n    static long long measureTime(Func&amp;&amp; func) {\n        auto start = std::chrono::high_resolution_clock::now();\n        func();\n        auto end = std::chrono::high_resolution_clock::now();\n        return std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(end - start).count();\n    }\n};\n\n\/\/ \u5b9f\u7528\u7684\u306a\u4f8b\uff1a\u30e1\u30fc\u30eb\u901a\u77e5\u30b7\u30b9\u30c6\u30e0\nclass EmailValidator {\npublic:\n    \/\/ \u5358\u7d14\u306a\u30c9\u30e1\u30a4\u30f3\u78ba\u8a8d\uff08string::find\u4f7f\u7528\uff09\n    static bool isCompanyEmail(const std::string&amp; email, const std::string&amp; domain) {\n        return email.find(domain) != std::string::npos;\n    }\n\n    \/\/ \u5b8c\u5168\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u691c\u8a3c\uff08\u6b63\u898f\u8868\u73fe\u4f7f\u7528\uff09\n    static bool isValidEmail(const std::string&amp; email) {\n        const std::regex pattern(R\"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})\");\n        return std::regex_match(email, pattern);\n    }\n};\n\nint main() {\n    \/\/ \u4f7f\u7528\u4f8b\u3068\u6bd4\u8f03\n    std::string email = \"user@example.com\";\n\n    \/\/ \u5358\u7d14\u306a\u30c9\u30e1\u30a4\u30f3\u30c1\u30a7\u30c3\u30af\n    if (EmailValidator::isCompanyEmail(email, \"@example.com\")) {\n        std::cout &lt;&lt; \"\u4f1a\u793e\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3067\u3059\" &lt;&lt; std::endl;\n    }\n\n    \/\/ \u5b8c\u5168\u306a\u5f62\u5f0f\u30c1\u30a7\u30c3\u30af\n    if (EmailValidator::isValidEmail(email)) {\n        std::cout &lt;&lt; \"\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3067\u3059\" &lt;&lt; std::endl;\n    }\n\n    \/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6bd4\u8f03\u306e\u5b9f\u884c\n    StringMatcher::compareMethods();\n\n    return 0;\n}<\/pre>\n\n\n\n<p>string::find\u3068\u6b63\u898f\u8868\u73fe\u306e\u6bd4\u8f03\uff1a<\/p>\n\n\n<div id=\"id-f1287b6c-fbfd-49fb-a9fd-56e4f800822f\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7279\u5fb4<\/th><th>string::find<\/th><th>\u6b63\u898f\u8868\u73fe<\/th><\/tr><\/thead><tbody><tr><td>\u5b9f\u88c5\u306e\u8907\u96d1\u3055<\/td><td>\u4f4e\u3044<\/td><td>\u9ad8\u3044<\/td><\/tr><tr><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/td><td>\u9ad8\u901f<\/td><td>\u6bd4\u8f03\u7684\u9045\u3044<\/td><\/tr><tr><td>\u30d1\u30bf\u30fc\u30f3\u67d4\u8edf\u6027<\/td><td>\u9650\u5b9a\u7684<\/td><td>\u975e\u5e38\u306b\u9ad8\u3044<\/td><\/tr><tr><td>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf<\/td><td>\u5c11\u306a\u3044<\/td><td>\u6bd4\u8f03\u7684\u591a\u3044<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">boost::algorithm \u3068\u306e\u6bd4\u8f03\u3068\u9078\u629e\u57fa\u6e96<\/h3>\n\n\n\n<p>Boost\u30e9\u30a4\u30d6\u30e9\u30ea\u306f\u3001\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u88dc\u5b8c\u3059\u308b\u5f37\u529b\u306a\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001boost::algorithm\u3068string::find\u306e\u6bd4\u8f03\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=\"\">#include &lt;iostream&gt;\n#include &lt;string&gt;\n#include &lt;boost\/algorithm\/string.hpp&gt;\n\nclass StringProcessor {\npublic:\n    \/\/ \u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u88c5\n    static bool containsStd(const std::string&amp; text, const std::string&amp; pattern) {\n        return text.find(pattern) != std::string::npos;\n    }\n\n    \/\/ Boost\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u88c5\n    static bool containsBoost(const std::string&amp; text, const std::string&amp; pattern) {\n        return boost::algorithm::contains(text, pattern);\n    }\n\n    \/\/ \u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u306a\u3044\u691c\u7d22\n    static bool containsInsensitive(const std::string&amp; text, const std::string&amp; pattern) {\n        return boost::algorithm::icontains(text, pattern);\n    }\n\n    \/\/ \u8907\u6570\u30d1\u30bf\u30fc\u30f3\u306e\u691c\u7d22\n    static bool containsAny(const std::string&amp; text,\n                          const std::vector&lt;std::string&gt;&amp; patterns) {\n        return boost::algorithm::contains_any_of(text, patterns);\n    }\n};\n\n\/\/ \u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u4f8b\uff1a\u30ed\u30b0\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\nclass LogFilter {\nprivate:\n    std::vector&lt;std::string&gt; keywords;\n    bool caseSensitive;\n\npublic:\n    LogFilter(const std::vector&lt;std::string&gt;&amp; kw, bool cs = true)\n        : keywords(kw), caseSensitive(cs) {}\n\n    bool matchLine(const std::string&amp; line) {\n        if (caseSensitive) {\n            return boost::algorithm::contains_any_of(line, keywords);\n        } else {\n            auto lowerLine = boost::algorithm::to_lower_copy(line);\n            std::vector&lt;std::string&gt; lowerKeywords;\n            for (const auto&amp; kw : keywords) {\n                lowerKeywords.push_back(boost::algorithm::to_lower_copy(kw));\n            }\n            return boost::algorithm::contains_any_of(lowerLine, lowerKeywords);\n        }\n    }\n};\n\nint main() {\n    std::string text = \"Hello, C++ World!\";\n    std::vector&lt;std::string&gt; keywords = {\"c++\", \"python\", \"java\"};\n\n    \/\/ \u57fa\u672c\u7684\u306a\u691c\u7d22\n    bool found1 = StringProcessor::containsStd(text, \"C++\");\n    bool found2 = StringProcessor::containsBoost(text, \"C++\");\n\n    \/\/ \u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u306a\u3044\u691c\u7d22\n    bool found3 = StringProcessor::containsInsensitive(text, \"c++\");\n\n    \/\/ \u8907\u6570\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\n    bool found4 = StringProcessor::containsAny(text, keywords);\n\n    \/\/ \u30ed\u30b0\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u306e\u4f8b\n    LogFilter filter(keywords, false);\n    bool matched = filter.matchLine(text);\n\n    std::cout &lt;&lt; \"\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u691c\u7d22\u7d50\u679c: \" &lt;&lt; found1 &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"Boost\u691c\u7d22\u7d50\u679c: \" &lt;&lt; found2 &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u306a\u3044\u691c\u7d22\u7d50\u679c: \" &lt;&lt; found3 &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"\u8907\u6570\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u7d50\u679c: \" &lt;&lt; found4 &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"\u30ed\u30b0\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u7d50\u679c: \" &lt;&lt; matched &lt;&lt; std::endl;\n\n    return 0;\n}<\/pre>\n\n\n\n<p>\u9078\u629e\u57fa\u6e96\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>string::find\u3092\u9078\u3076\u5834\u5408<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5358\u7d14\u306a\u90e8\u5206\u6587\u5b57\u5217\u306e\u691c\u7d22<\/li>\n\n\n\n<li>\u6700\u9ad8\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u304c\u5fc5\u8981<\/li>\n\n\n\n<li>\u5916\u90e8\u4f9d\u5b58\u3092\u6700\u5c0f\u9650\u306b\u3057\u305f\u3044<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6291\u3048\u305f\u3044<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6b63\u898f\u8868\u73fe\u3092\u9078\u3076\u5834\u5408<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8907\u96d1\u306a\u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u30f3\u30b0\u304c\u5fc5\u8981<\/li>\n\n\n\n<li>\u30d1\u30bf\u30fc\u30f3\u306e\u67d4\u8edf\u6027\u304c\u91cd\u8981<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3088\u308a\u3082\u6a5f\u80fd\u6027\u3092\u91cd\u8996<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>boost::algorithm\u3092\u9078\u3076\u5834\u5408<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9ad8\u5ea6\u306a\u6587\u5b57\u5217\u64cd\u4f5c\u304c\u5fc5\u8981<\/li>\n\n\n\n<li>\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u306a\u3044\u691c\u7d22<\/li>\n\n\n\n<li>\u8907\u6570\u30d1\u30bf\u30fc\u30f3\u306e\u540c\u6642\u691c\u7d22<\/li>\n\n\n\n<li>\u65e2\u306bBoost\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u5b9f\u88c5\u9078\u629e\u306e\u5224\u65ad\u57fa\u6e96\uff1a<\/p>\n\n\n<div id=\"id-61256b58-0d2b-47ad-a902-2af6cb7d57f9\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8981\u4ef6<\/th><th>\u63a8\u5968\u3055\u308c\u308b\u9078\u629e<\/th><th>\u7406\u7531<\/th><\/tr><\/thead><tbody><tr><td>\u30b7\u30f3\u30d7\u30eb\u306a\u691c\u7d22<\/td><td>string::find<\/td><td>\u8efd\u91cf\u3067\u9ad8\u901f<\/td><\/tr><tr><td>\u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u30f3\u30b0<\/td><td>\u6b63\u898f\u8868\u73fe<\/td><td>\u67d4\u8edf\u306a\u8868\u73fe\u304c\u53ef\u80fd<\/td><\/tr><tr><td>\u9ad8\u5ea6\u306a\u6587\u5b57\u5217\u64cd\u4f5c<\/td><td>boost::algorithm<\/td><td>\u8c4a\u5bcc\u306a\u6a5f\u80fd<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u308c\u3089\u306e\u6bd4\u8f03\u3092\u8e0f\u307e\u3048\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u5b9f\u88c5\u3092\u9078\u629e\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001string::find\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-15\">string::find \u306e\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/h2>\n\n\n\n<p>string::find\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306f\u3001\u5b89\u5b9a\u3057\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u4e0d\u53ef\u6b20\u3067\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b89\u5168\u306a\u5b9f\u88c5\u65b9\u6cd5\u3068\u4e00\u822c\u7684\u306a\u554f\u984c\u306e\u89e3\u6c7a\u7b56\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u5b89\u5168\u306a\u6587\u5b57\u5217\u691c\u7d22\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u6587\u5b57\u5217\u691c\u7d22\u306b\u304a\u3051\u308b\u5b89\u5168\u6027\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u306f\u3001\u9069\u5207\u306a\u5883\u754c\u30c1\u30a7\u30c3\u30af\u3068\u30a8\u30e9\u30fc\u51e6\u7406\u304c\u91cd\u8981\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u5b89\u5168\u306a\u5b9f\u88c5\u306e\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=\"\">#include &lt;iostream&gt;\n#include &lt;string&gt;\n#include &lt;stdexcept&gt;\n#include &lt;optional&gt;\n\nclass SafeStringSearcher {\npublic:\n    \/\/ \u4f8b\u5916\u5b89\u5168\u306a\u6587\u5b57\u5217\u691c\u7d22\n    static std::optional&lt;size_t&gt; findSafe(const std::string&amp; text,\n                                        const std::string&amp; pattern) {\n        try {\n            if (pattern.empty()) {\n                throw std::invalid_argument(\"\u691c\u7d22\u30d1\u30bf\u30fc\u30f3\u304c\u7a7a\u3067\u3059\");\n            }\n\n            if (text.empty()) {\n                return std::nullopt;\n            }\n\n            size_t pos = text.find(pattern);\n            return pos != std::string::npos ? std::optional&lt;size_t&gt;(pos) \n                                          : std::nullopt;\n        } catch (const std::exception&amp; e) {\n            std::cerr &lt;&lt; \"\u691c\u7d22\u30a8\u30e9\u30fc: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n            return std::nullopt;\n        }\n    }\n\n    \/\/ \u7bc4\u56f2\u30c1\u30a7\u30c3\u30af\u4ed8\u304d\u306e\u90e8\u5206\u6587\u5b57\u5217\u62bd\u51fa\n    static std::optional&lt;std::string&gt; extractSafe(const std::string&amp; text,\n                                                size_t start,\n                                                size_t length) {\n        try {\n            if (start &gt;= text.length()) {\n                throw std::out_of_range(\"\u958b\u59cb\u4f4d\u7f6e\u304c\u6587\u5b57\u5217\u306e\u7bc4\u56f2\u5916\u3067\u3059\");\n            }\n\n            \/\/ length\u306e\u81ea\u52d5\u8abf\u6574\n            length = std::min(length, text.length() - start);\n\n            return text.substr(start, length);\n        } catch (const std::exception&amp; e) {\n            std::cerr &lt;&lt; \"\u62bd\u51fa\u30a8\u30e9\u30fc: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n            return std::nullopt;\n        }\n    }\n\n    \/\/ \u8907\u6570\u30d1\u30bf\u30fc\u30f3\u306e\u5b89\u5168\u306a\u691c\u7d22\n    struct SearchResult {\n        bool found;\n        size_t position;\n        std::string pattern;\n    };\n\n    static std::vector&lt;SearchResult&gt; findMultipleSafe(\n        const std::string&amp; text,\n        const std::vector&lt;std::string&gt;&amp; patterns) {\n        std::vector&lt;SearchResult&gt; results;\n\n        try {\n            for (const auto&amp; pattern : patterns) {\n                if (pattern.empty()) continue;\n\n                size_t pos = text.find(pattern);\n                results.push_back({\n                    pos != std::string::npos,\n                    pos,\n                    pattern\n                });\n            }\n        } catch (const std::exception&amp; e) {\n            std::cerr &lt;&lt; \"\u8907\u6570\u30d1\u30bf\u30fc\u30f3\u691c\u7d22\u30a8\u30e9\u30fc: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n        }\n\n        return results;\n    }\n};\n\n\/\/ \u30a8\u30e9\u30fc\u51e6\u7406\u3092\u542b\u3080\u6587\u5b57\u5217\u51e6\u7406\u30af\u30e9\u30b9\nclass StringProcessor {\nprivate:\n    std::string text;\n\npublic:\n    StringProcessor(const std::string&amp; input) : text(input) {}\n\n    \/\/ \u5b89\u5168\u306a\u7f6e\u63db\u51e6\u7406\n    bool replaceFirst(const std::string&amp; from, const std::string&amp; to) {\n        try {\n            if (from.empty()) {\n                throw std::invalid_argument(\"\u7f6e\u63db\u5143\u6587\u5b57\u5217\u304c\u7a7a\u3067\u3059\");\n            }\n\n            size_t pos = text.find(from);\n            if (pos != std::string::npos) {\n                text.replace(pos, from.length(), to);\n                return true;\n            }\n            return false;\n        } catch (const std::exception&amp; e) {\n            std::cerr &lt;&lt; \"\u7f6e\u63db\u30a8\u30e9\u30fc: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n            return false;\n        }\n    }\n\n    \/\/ \u7bc4\u56f2\u30c1\u30a7\u30c3\u30af\u4ed8\u304d\u306e\u6587\u5b57\u5217\u5206\u5272\n    std::vector&lt;std::string&gt; split(const std::string&amp; delimiter) {\n        std::vector&lt;std::string&gt; result;\n\n        try {\n            if (delimiter.empty()) {\n                throw std::invalid_argument(\"\u533a\u5207\u308a\u6587\u5b57\u304c\u7a7a\u3067\u3059\");\n            }\n\n            size_t pos = 0;\n            size_t next = 0;\n\n            while ((next = text.find(delimiter, pos)) != std::string::npos) {\n                result.push_back(text.substr(pos, next - pos));\n                pos = next + delimiter.length();\n            }\n\n            if (pos &lt; text.length()) {\n                result.push_back(text.substr(pos));\n            }\n        } catch (const std::exception&amp; e) {\n            std::cerr &lt;&lt; \"\u5206\u5272\u30a8\u30e9\u30fc: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n        }\n\n        return result;\n    }\n};\n\n\/\/ \u4f7f\u7528\u4f8b\nint main() {\n    \/\/ \u5b89\u5168\u306a\u691c\u7d22\u306e\u4f8b\n    if (auto pos = SafeStringSearcher::findSafe(\"Hello, World!\", \"World\")) {\n        std::cout &lt;&lt; \"Found at position: \" &lt;&lt; *pos &lt;&lt; std::endl;\n    }\n\n    \/\/ \u7bc4\u56f2\u5916\u30a2\u30af\u30bb\u30b9\u306e\u9632\u6b62\n    auto text = SafeStringSearcher::extractSafe(\"Hello\", 10, 5);\n    if (!text) {\n        std::cout &lt;&lt; \"\u5b89\u5168\u306b\u7bc4\u56f2\u5916\u30a2\u30af\u30bb\u30b9\u3092\u9632\u6b62\u3057\u307e\u3057\u305f\" &lt;&lt; std::endl;\n    }\n\n    \/\/ \u6587\u5b57\u5217\u51e6\u7406\u306e\u4f8b\n    StringProcessor processor(\"Hello, World!, Hello\");\n    processor.replaceFirst(\"Hello\", \"Hi\");\n    auto parts = processor.split(\", \");\n\n    return 0;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u3088\u304f\u3042\u308b\u30d0\u30b0\u3068\u5bfe\u51e6\u6cd5<\/h3>\n\n\n\n<p>string::find\u3092\u4f7f\u7528\u3059\u308b\u969b\u306b\u3088\u304f\u906d\u9047\u3059\u308b\u30d0\u30b0\u3068\u305d\u306e\u5bfe\u51e6\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5883\u754c\u6761\u4ef6\u306b\u95a2\u3059\u308b\u554f\u984c<\/li>\n<\/ol>\n\n\n<div id=\"id-da9f40c1-fa5f-41d5-a792-d17e4c2abd1d\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u554f\u984c<\/th><th>\u5bfe\u51e6\u6cd5<\/th><th>\u5b9f\u88c5\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>\u7a7a\u6587\u5b57\u5217<\/td><td>\u660e\u793a\u7684\u306a\u30c1\u30a7\u30c3\u30af<\/td><td><code>if (str.empty()) return std::nullopt;<\/code><\/td><\/tr><tr><td>\u7bc4\u56f2\u5916\u30a2\u30af\u30bb\u30b9<\/td><td>\u4e8b\u524d\u691c\u8a3c<\/td><td><code>if (pos &gt;= str.length()) throw std::out_of_range();<\/code><\/td><\/tr><tr><td>\u30d1\u30bf\u30fc\u30f3\u9577\u8d85\u904e<\/td><td>\u9577\u3055\u306e\u6bd4\u8f03<\/td><td><code>if (pattern.length() &gt; text.length()) return std::nullopt;<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/li>\n<\/ol>\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 StringSearchGuard {\npublic:\n    \/\/ RAII\u539f\u5247\u306b\u57fa\u3065\u304f\u30a8\u30e9\u30fc\u51e6\u7406\n    class SearchGuard {\n    private:\n        bool&amp; succeeded;\n    public:\n        SearchGuard(bool&amp; success) : succeeded(success) {\n            succeeded = false;\n        }\n        ~SearchGuard() {\n            \/\/ \u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\u51e6\u7406\n        }\n        void markSuccess() {\n            succeeded = true;\n        }\n    };\n\n    static bool searchWithGuard(const std::string&amp; text,\n                              const std::string&amp; pattern,\n                              size_t&amp; result) {\n        bool succeeded = false;\n        SearchGuard guard(succeeded);\n\n        try {\n            if (!text.empty() &amp;&amp; !pattern.empty()) {\n                result = text.find(pattern);\n                if (result != std::string::npos) {\n                    guard.markSuccess();\n                }\n            }\n        } catch (...) {\n            \/\/ \u4f8b\u5916\u3092\u30ad\u30e3\u30c3\u30c1\u3057\u3066\u9069\u5207\u306b\u51e6\u7406\n        }\n\n        return succeeded;\n    }\n};<\/pre>\n\n\n\n<p>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u4e3b\u8981\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5165\u529b\u691c\u8a3c<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7a7a\u6587\u5b57\u5217\u306e\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u30d1\u30bf\u30fc\u30f3\u9577\u306e\u59a5\u5f53\u6027\u78ba\u8a8d<\/li>\n\n\n\n<li>\u6587\u5b57\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u8003\u616e<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f8b\u5916\u5b89\u5168\u6027<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RAII\u539f\u5247\u306e\u9069\u7528<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u89e3\u653e<\/li>\n\n\n\n<li>\u4f8b\u5916\u306e\u9069\u5207\u306a\u4f1d\u64ad<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u5831\u544a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u610f\u5473\u306e\u3042\u308b\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8<\/li>\n\n\n\n<li>\u30ed\u30b0\u8a18\u9332\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u306e\u63d0\u4f9b<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u624b\u6cd5\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5b89\u5168\u3067\u4fe1\u983c\u6027\u306e\u9ad8\u3044\u6587\u5b57\u5217\u691c\u7d22\u51e6\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001string::find\u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-18\">string::find \u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<p>string::find\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\u3092\u7fd2\u5f97\u3057\u305f\u5f8c\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u8907\u96d1\u306a\u8981\u4ef6\u306b\u3082\u5bfe\u5fdc\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u8df5\u7684\u306a\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u8907\u6570\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u52b9\u7387\u7684\u306b\u691c\u7d22\u3059\u308b\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u8907\u6570\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u52b9\u7387\u7684\u306b\u691c\u7d22\u3059\u308b\u306b\u306f\u3001\u9069\u5207\u306a\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u3068\u30c7\u30fc\u30bf\u69cb\u9020\u306e\u9078\u629e\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=\"\">#include &lt;iostream&gt;\n#include &lt;string&gt;\n#include &lt;vector&gt;\n#include &lt;unordered_map&gt;\n#include &lt;queue&gt;\n#include &lt;algorithm&gt;\n\nclass MultiPatternSearcher {\nprivate:\n    struct SearchResult {\n        std::string pattern;\n        size_t position;\n\n        bool operator&gt;(const SearchResult&amp; other) const {\n            return position &gt; other.position;\n        }\n    };\n\npublic:\n    \/\/ \u512a\u5148\u5ea6\u30ad\u30e5\u30fc\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u8907\u6570\u30d1\u30bf\u30fc\u30f3\u691c\u7d22\n    static std::vector&lt;SearchResult&gt; findAllPatterns(\n        const std::string&amp; text,\n        const std::vector&lt;std::string&gt;&amp; patterns) {\n        std::priority_queue&lt;SearchResult, std::vector&lt;SearchResult&gt;,\n                          std::greater&lt;SearchResult&gt;&gt; results;\n\n        for (const auto&amp; pattern : patterns) {\n            size_t pos = 0;\n            while ((pos = text.find(pattern, pos)) != std::string::npos) {\n                results.push({pattern, pos});\n                pos += 1;\n            }\n        }\n\n        std::vector&lt;SearchResult&gt; sortedResults;\n        while (!results.empty()) {\n            sortedResults.push_back(results.top());\n            results.pop();\n        }\n\n        return sortedResults;\n    }\n\n    \/\/ Aho-Corasick\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u7c21\u7565\u5b9f\u88c5\n    class AhoCorasick {\n    private:\n        struct TrieNode {\n            std::unordered_map&lt;char, std::unique_ptr&lt;TrieNode&gt;&gt; children;\n            bool isEnd = false;\n            std::string pattern;\n            TrieNode* fail = nullptr;\n        };\n\n        std::unique_ptr&lt;TrieNode&gt; root;\n\n        void buildFailureLinks() {\n            std::queue&lt;TrieNode*&gt; q;\n\n            \/\/ \u30eb\u30fc\u30c8\u306e\u5b50\u30ce\u30fc\u30c9\u306e\u5931\u6557\u30ea\u30f3\u30af\u3092\u30eb\u30fc\u30c8\u306b\u8a2d\u5b9a\n            for (auto&amp; pair : root-&gt;children) {\n                pair.second-&gt;fail = root.get();\n                q.push(pair.second.get());\n            }\n\n            \/\/ BFS\u3067\u5931\u6557\u30ea\u30f3\u30af\u3092\u69cb\u7bc9\n            while (!q.empty()) {\n                TrieNode* current = q.front();\n                q.pop();\n\n                for (auto&amp; pair : current-&gt;children) {\n                    char c = pair.first;\n                    TrieNode* child = pair.second.get();\n                    q.push(child);\n\n                    TrieNode* fail = current-&gt;fail;\n                    while (fail &amp;&amp; !fail-&gt;children.count(c)) {\n                        fail = fail-&gt;fail;\n                    }\n\n                    child-&gt;fail = fail ? fail-&gt;children[c].get() : root.get();\n                }\n            }\n        }\n\n    public:\n        AhoCorasick(const std::vector&lt;std::string&gt;&amp; patterns) {\n            root = std::make_unique&lt;TrieNode&gt;();\n\n            \/\/ \u30d1\u30bf\u30fc\u30f3\u3092Trie\u306b\u8ffd\u52a0\n            for (const auto&amp; pattern : patterns) {\n                TrieNode* current = root.get();\n                for (char c : pattern) {\n                    if (!current-&gt;children[c]) {\n                        current-&gt;children[c] = std::make_unique&lt;TrieNode&gt;();\n                    }\n                    current = current-&gt;children[c].get();\n                }\n                current-&gt;isEnd = true;\n                current-&gt;pattern = pattern;\n            }\n\n            buildFailureLinks();\n        }\n\n        std::vector&lt;std::pair&lt;std::string, size_t&gt;&gt; search(const std::string&amp; text) {\n            std::vector&lt;std::pair&lt;std::string, size_t&gt;&gt; results;\n            TrieNode* current = root.get();\n\n            for (size_t i = 0; i &lt; text.length(); ++i) {\n                char c = text[i];\n\n                while (current != root.get() &amp;&amp; !current-&gt;children.count(c)) {\n                    current = current-&gt;fail;\n                }\n\n                if (current-&gt;children.count(c)) {\n                    current = current-&gt;children[c].get();\n                }\n\n                if (current-&gt;isEnd) {\n                    results.emplace_back(current-&gt;pattern,\n                                       i - current-&gt;pattern.length() + 1);\n                }\n            }\n\n            return results;\n        }\n    };\n};\n\n### Unicode\u6587\u5b57\u5217\u3067\u306e\u6b63\u3057\u3044\u691c\u7d22\u65b9\u6cd5\n\nUnicode\u30c6\u30ad\u30b9\u30c8\u3092\u6b63\u3057\u304f\u51e6\u7406\u3059\u308b\u306b\u306f\u3001\u9069\u5207\u306a\u6587\u5b57\u30b3\u30fc\u30c9\u51e6\u7406\u304c\u5fc5\u8981\u3067\u3059\u3002<\/pre>\n\n\n\n<p>cpp<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-20\">include<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-21\">include<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-22\">include<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-23\">include<\/h1>\n\n\n\n<p>class UnicodeStringSearcher {<br>public:<br>\/\/ UTF-8\u6587\u5b57\u5217\u3067\u306e\u691c\u7d22<br>static std::vector findUtf8(const std::string&amp; text,<br>const std::string&amp; pattern) {<br>std::vector positions;<br>size_t pos = 0;<\/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=\"\">    while ((pos = text.find(pattern, pos)) != std::string::npos) {\n        \/\/ UTF-8\u30d0\u30a4\u30c8\u30b7\u30fc\u30b1\u30f3\u30b9\u306e\u691c\u8a3c\n        if (isValidUtf8Sequence(text, pos)) {\n            positions.push_back(pos);\n        }\n        pos += 1;\n    }\n\n    return positions;\n}<\/pre>\n\n\n\n<p>private:<br>\/\/ UTF-8\u30b7\u30fc\u30b1\u30f3\u30b9\u306e\u59a5\u5f53\u6027\u30c1\u30a7\u30c3\u30af<br>static bool isValidUtf8Sequence(const std::string&amp; text, size_t pos) {<br>if (pos &gt;= text.length()) return false;<\/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=\"\">    unsigned char first = static_cast&lt;unsigned char&gt;(text[pos]);\n    size_t expectedLength = 0;\n\n    if (first &lt; 0x80) {\n        expectedLength = 1;\n    } else if ((first &amp; 0xE0) == 0xC0) {\n        expectedLength = 2;\n    } else if ((first &amp; 0xF0) == 0xE0) {\n        expectedLength = 3;\n    } else if ((first &amp; 0xF8) == 0xF0) {\n        expectedLength = 4;\n    } else {\n        return false;\n    }\n\n    if (pos + expectedLength &gt; text.length()) {\n        return false;\n    }\n\n    \/\/ \u7d9a\u304d\u306e\u30d0\u30a4\u30c8\u306e\u691c\u8a3c\n    for (size_t i = 1; i &lt; expectedLength; ++i) {\n        unsigned char byte = static_cast&lt;unsigned char&gt;(text[pos + i]);\n        if ((byte &amp; 0xC0) != 0x80) {\n            return false;\n        }\n    }\n\n    return true;\n}<\/pre>\n\n\n\n<p>};<\/p>\n\n\n\n<p>\/\/ \u9ad8\u5ea6\u306a\u6587\u5b57\u5217\u51e6\u7406\u306e\u4f8b<br>class AdvancedStringProcessor {<br>public:<br>\/\/ \u6587\u5b57\u5217\u306e\u6b63\u898f\u5316<br>static std::string normalize(const std::string&amp; text) {<br>\/\/ NFC\u307e\u305f\u306fNFKC\u6b63\u898f\u5316\u306e\u5b9f\u88c5<br>return text; \/\/ \u5b9f\u969b\u306e\u5b9f\u88c5\u3067\u306f\u9069\u5207\u306a\u6b63\u898f\u5316\u3092\u884c\u3046<br>}<\/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=\"\">\/\/ \u6587\u5b57\u5217\u306e\u6bd4\u8f03\uff08\u7167\u5408\u9806\u5e8f\u3092\u8003\u616e\uff09\nstatic int compare(const std::string&amp; text1,\n                  const std::string&amp; text2,\n                  const std::locale&amp; loc = std::locale()) {\n    const std::collate&lt;char&gt;&amp; coll = \n        std::use_facet&lt;std::collate&lt;char&gt;&gt;(loc);\n    return coll.compare(text1.data(), text1.data() + text1.length(),\n                      text2.data(), text2.data() + text2.length());\n}<\/pre>\n\n\n\n<p>};<\/p>\n\n\n\n<p>\/\/ \u4f7f\u7528\u4f8b<br>int main() {<br>std::string text = u8\u2033Hello, \u4e16\u754c! \u3053\u3093\u306b\u3061\u306f\u201d;<br>std::string pattern = u8\u2033\u4e16\u754c\u201d;<\/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=\"\">auto positions = UnicodeStringSearcher::findUtf8(text, pattern);\n\nfor (auto pos : positions) {\n    std::cout &lt;&lt; \"Found at byte position: \" &lt;&lt; pos &lt;&lt; std::endl;\n}\n\n\/\/ \u8907\u6570\u30d1\u30bf\u30fc\u30f3\u691c\u7d22\u306e\u4f8b\nstd::vector&lt;std::string&gt; patterns = {\n    u8\"Hello\",\n    u8\"\u4e16\u754c\",\n    u8\"\u3053\u3093\u306b\u3061\u306f\"\n};\n\nMultiPatternSearcher::AhoCorasick ac(patterns);\nauto results = ac.search(text);\n\nfor (const auto&amp; [pattern, pos] : results) {\n    std::cout &lt;&lt; \"Pattern: \" &lt;&lt; pattern \n             &lt;&lt; \" found at position: \" &lt;&lt; pos &lt;&lt; std::endl;\n}\n\nreturn 0;<\/pre>\n\n\n\n<p>}<br>\u201c`<\/p>\n\n\n\n<p>\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8907\u6570\u30d1\u30bf\u30fc\u30f3\u691c\u7d22\u306e\u6700\u9069\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u512a\u5148\u5ea6\u30ad\u30e5\u30fc\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>Aho-Corasick\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30d1\u30bf\u30fc\u30f3\u306e\u30d7\u30ea\u30d7\u30ed\u30bb\u30b9<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Unicode\u5bfe\u5fdc<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>UTF-8\u30b7\u30fc\u30b1\u30f3\u30b9\u306e\u691c\u8a3c<\/li>\n\n\n\n<li>\u6b63\u898f\u5316\u51e6\u7406<\/li>\n\n\n\n<li>\u7167\u5408\u9806\u5e8f\u306e\u8003\u616e<\/li>\n<\/ul>\n\n\n\n<p>\u6027\u80fd\u6bd4\u8f03\uff1a<\/p>\n\n\n<div id=\"id-25782c67-4a1e-4062-add3-4c3588cc75c8\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u624b\u6cd5<\/th><th>\u6642\u9593\u8907\u96d1\u5ea6<\/th><th>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf<\/th><th>\u9069\u7528\u30b7\u30fc\u30f3<\/th><\/tr><\/thead><tbody><tr><td>\u5358\u7d14\u306a\u691c\u7d22<\/td><td>O(n*m)<\/td><td>O(1)<\/td><td>\u5c11\u6570\u30d1\u30bf\u30fc\u30f3<\/td><\/tr><tr><td>Aho-Corasick<\/td><td>O(n + m)<\/td><td>O(m)<\/td><td>\u591a\u6570\u30d1\u30bf\u30fc\u30f3<\/td><\/tr><tr><td>UTF-8\u691c\u7d22<\/td><td>O(n)<\/td><td>O(1)<\/td><td>Unicode\u6587\u5b57\u5217<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u308c\u3089\u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u8907\u96d1\u306a\u8981\u4ef6\u306b\u3082\u5bfe\u5fdc\u3067\u304d\u308b\u5805\u7262\u306a\u6587\u5b57\u5217\u691c\u7d22\u51e6\u7406\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\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":[5],"tags":[],"class_list":{"0":"post-2116","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-cpp","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2116","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=2116"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2116\/revisions"}],"predecessor-version":[{"id":2117,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2116\/revisions\/2117"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}