{"id":705,"date":"2024-11-15T11:29:45","date_gmt":"2024-11-15T02:29:45","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=705"},"modified":"2025-03-24T08:52:54","modified_gmt":"2025-03-23T23:52:54","slug":"%e3%80%90java%e5%85%a5%e9%96%80%e3%80%91%e6%ad%a3%e8%a6%8f%e8%a1%a8%e7%8f%be%e3%83%81%e3%82%a7%e3%83%83%e3%82%af%e3%81%ae%e5%ae%9f%e8%a3%85%e6%96%b9%e6%b3%95%e3%81%a87%e3%81%a4%e3%81%ae%e3%83%99","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=705","title":{"rendered":"\u3010Java\u5165\u9580\u3011\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5\u65b9\u6cd5\u30687\u3064\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9 \u301c\u73fe\u5834\u3067\u4f7f\u3048\u308b\u5b9f\u8df5\u30ac\u30a4\u30c9\u301c"},"content":{"rendered":"<div id=\"sgb-css-id-1\">\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\">\u306f\u3058\u3081\u306b<\/a>  <\/li>  <li>    <a href=\"#i-1\">\uff11\uff0e\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-2\">1.1 \u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u3068\u306f\u4f55\u304b\uff1f\u5177\u4f53\u4f8b\u3067\u7406\u89e3\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-5\">1.2 Java\u3067\u306ePattern\u30af\u30e9\u30b9\u3068Matcher\u30af\u30e9\u30b9\u306e\u5f79\u5272<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-8\">1.3 matches()\u3068find()\u306e\u9055\u3044\u3092\u7406\u89e3\u3057\u3088\u3046<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-11\">\uff12\uff0e\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-12\">2.1 Pattern.compile\u3092\u4f7f\u7528\u3057\u305f\u57fa\u672c\u5b9f\u88c5<\/a>      <\/li>      <li>        <a href=\"#i-13\">2.2 String.matches\u30e1\u30bd\u30c3\u30c9\u306b\u3088\u308b\u7c21\u6613\u5b9f\u88c5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-14\">2.3 Matcher\u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u305f\u9ad8\u5ea6\u306a\u5b9f\u88c5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-17\">\uff13\uff0e\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-18\">3.1 \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u691c\u8a3c\u30d1\u30bf\u30fc\u30f3<\/a>      <\/li>      <li>        <a href=\"#i-19\">3.2 \u96fb\u8a71\u756a\u53f7\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u30c1\u30a7\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-21\">3.3 \u65e5\u4ed8\u5f62\u5f0f\u306e\u691c\u8a3c\u30d1\u30bf\u30fc\u30f3<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-23\">\uff14\uff0e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-24\">4.1 Pattern.compile\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565<\/a>      <\/li>      <li>        <a href=\"#i-26\">4.2 ReDoS\u653b\u6483\u3092\u9632\u3050\u305f\u3081\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-28\">4.3 \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306eTips<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-30\">\uff15\uff0e\u5b9f\u8df5\u7684\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5\u4f8b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-31\">5.1 \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30af\u30e9\u30b9\u306e\u8a2d\u8a08\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-33\">5.2 \u30ab\u30b9\u30bf\u30e0\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-34\">5.3 \u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\u66f8\u304d\u65b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-36\">\uff16\uff0e\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u5bfe\u51e6\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-37\">6.1 \u30d1\u30bf\u30fc\u30f3\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306e\u30a8\u30e9\u30fc\u5bfe\u7b56<\/a>      <\/li>      <li>        <a href=\"#i-39\">6.2 \u30de\u30c3\u30c1\u30f3\u30b0\u5b9f\u884c\u6642\u306e\u4f8b\u5916\u51e6\u7406<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-40\">6.3 \u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306e\u30ed\u30b0\u51fa\u529b\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-42\">\uff17\uff0e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-43\">7.1 \u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u547d\u540d\u898f\u5247<\/a>      <\/li>      <li>        <a href=\"#i-45\">7.2 \u907f\u3051\u308b\u3079\u304d\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-47\">7.3 \u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u3067\u306e\u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-49\">\u307e\u3068\u3081<\/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\">\u306f\u3058\u3081\u306b<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-2\">\n<p>\u6b63\u898f\u8868\u73fe\u306b\u3088\u308b\u30c7\u30fc\u30bf\u691c\u8a3c\u306f\u3001Java\u958b\u767a\u306b\u304a\u3044\u3066\u91cd\u8981\u306a\u30b9\u30ad\u30eb\u306e\u4e00\u3064\u3067\u3059\u3002\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3084\u96fb\u8a71\u756a\u53f7\u306e\u5f62\u5f0f\u30c1\u30a7\u30c3\u30af\u3001\u5165\u529b\u30c7\u30fc\u30bf\u306e\u691c\u8a3c\u306a\u3069\u3001\u3055\u307e\u3056\u307e\u306a\u5834\u9762\u3067\u6d3b\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u3057\u304b\u3057\u3001\u6b63\u898f\u8868\u73fe\u306e\u5b9f\u88c5\u65b9\u6cd5\u306f\u8907\u6570\u3042\u308a\u3001\u305d\u308c\u305e\u308c\u306b\u7279\u5fb4\u304c\u3042\u308a\u307e\u3059\u3002\u307e\u305f\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3084\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u89b3\u70b9\u304b\u3089\u3082\u3001\u9069\u5207\u306a\u5b9f\u88c5\u65b9\u6cd5\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-3\">\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001Java\u958b\u767a\u8005\u304c\u62bc\u3055\u3048\u3066\u304a\u304f\u3079\u304d\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5\u65b9\u6cd5\u3068\u3001\u73fe\u5834\u3067\u6d3b\u7528\u3067\u304d\u308b7\u3064\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u3064\u3044\u3066\u3001\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3068\u3068\u3082\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-8\">\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u672c\u8a18\u4e8b\u3067\u5b66\u3079\u308b\u3053\u3068<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<ul class=\"wp-block-list\"><div id=\"sgb-css-id-4\">\n<li>Java\u3067\u306e\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306e\u57fa\u672c\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/li>\n<\/div>\n\n<div id=\"sgb-css-id-5\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af<\/li>\n<\/div>\n\n<div id=\"sgb-css-id-6\">\n<li>\u5b9f\u52d9\u3067\u4f7f\u3048\u308b\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u3068\u5b9f\u88c5\u4f8b<\/li>\n<\/div>\n\n<div id=\"sgb-css-id-7\">\n<li>\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5<\/li>\n<\/div>\n\n\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u306e\u30dd\u30a4\u30f3\u30c8\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/li>\n<\/ul>\n<\/div><\/div>\n<\/div>\n\n<div id=\"sgb-css-id-9\">\n<p>\u307e\u305a\u306f\u57fa\u790e\u304b\u3089\u5b66\u3073\u3001\u5f90\u3005\u306b\u5b9f\u8df5\u7684\u306a\u5185\u5bb9\u3078\u3068\u9032\u3093\u3067\u3044\u304d\u307e\u3057\u3087\u3046\u3002\u5404\u30bb\u30af\u30b7\u30e7\u30f3\u306b\u306f\u5177\u4f53\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3092\u7528\u610f\u3057\u3066\u3044\u307e\u3059\u306e\u3067\u3001\u624b\u5143\u3067\u52d5\u304b\u3057\u306a\u304c\u3089\u7406\u89e3\u3092\u6df1\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-10\">\n<p>\u305d\u308c\u3067\u306f\u3001\u6700\u521d\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u304b\u3089\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-11\">\n<h2 class=\"wp-block-heading\" id=\"i-1\">\uff11\uff0e\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-12\">\n<h3 class=\"wp-block-heading\" id=\"i-2\">1.1 \u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u3068\u306f\u4f55\u304b\uff1f\u5177\u4f53\u4f8b\u3067\u7406\u89e3\u3059\u308b<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-13\">\n<p>\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\uff08Regular Expression Check\uff09\u3068\u306f\u3001\u7279\u5b9a\u306e\u30d1\u30bf\u30fc\u30f3\u306b\u5f93\u3063\u3066\u6587\u5b57\u5217\u304c\u8a18\u8ff0\u3055\u308c\u3066\u3044\u308b\u304b\u3092\u691c\u8a3c\u3059\u308b\u624b\u6cd5\u3067\u3059\u3002Java\u3067\u306f<code>java.util.regex<\/code>\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u4f7f\u7528\u3057\u3066\u3001\u3053\u306e\u691c\u8a3c\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-14\">\n<h4 class=\"wp-block-heading\" id=\"i-3\">\u57fa\u672c\u7684\u306a\u4f7f\u7528\u4f8b<\/h4>\n<\/div>\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=\"\">\/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u5f62\u5f0f\u3092\u30c1\u30a7\u30c3\u30af\u3059\u308b\u4f8b\nString email = \"user@example.com\";\nboolean isValid = email.matches(\"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}\");\n\n\/\/ \u90f5\u4fbf\u756a\u53f7\u306e\u5f62\u5f0f\u3092\u30c1\u30a7\u30c3\u30af\u3059\u308b\u4f8b\uff08123-4567\u306e\u5f62\u5f0f\uff09\nString zipCode = \"123-4567\";\nboolean isValidZip = zipCode.matches(\"\\\\d{3}-\\\\d{4}\");<\/pre>\n\n\n<div id=\"sgb-css-id-15\">\n<h4 class=\"wp-block-heading\" id=\"i-4\">\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306e\u4e3b\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9<\/h4>\n<\/div>\n\n<div id=\"id-ba4594fb-8f5b-45bc-9fc0-334fbb60a169\"><div id=\"sgb-css-id-16\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9<\/th><th>\u8aac\u660e<\/th><th>\u4f7f\u7528\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>\u5165\u529b\u691c\u8a3c<\/td><td>\u30d5\u30a9\u30fc\u30e0\u306b\u5165\u529b\u3055\u308c\u305f\u5024\u304c\u6b63\u3057\u3044\u5f62\u5f0f\u304b\u78ba\u8a8d<\/td><td>\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3001\u96fb\u8a71\u756a\u53f7\u3001\u90f5\u4fbf\u756a\u53f7\u306a\u3069<\/td><\/tr><tr><td>\u30c7\u30fc\u30bf\u62bd\u51fa<\/td><td>\u7279\u5b9a\u306e\u30d1\u30bf\u30fc\u30f3\u306b\u4e00\u81f4\u3059\u308b\u90e8\u5206\u3092\u62bd\u51fa<\/td><td>\u30ed\u30b0\u304b\u3089\u306e\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u62bd\u51fa\u3001URL\u306e\u62bd\u51fa\u306a\u3069<\/td><\/tr><tr><td>\u6587\u5b57\u5217\u7f6e\u63db<\/td><td>\u30d1\u30bf\u30fc\u30f3\u306b\u4e00\u81f4\u3059\u308b\u90e8\u5206\u3092\u5225\u306e\u6587\u5b57\u5217\u306b\u7f6e\u63db<\/td><td>\u6a5f\u5bc6\u60c5\u5831\u306e\u30de\u30b9\u30ad\u30f3\u30b0\u3001\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u5909\u63db\u306a\u3069<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-17\">\n<h3 class=\"wp-block-heading\" id=\"i-5\">1.2 Java\u3067\u306ePattern\u30af\u30e9\u30b9\u3068Matcher\u30af\u30e9\u30b9\u306e\u5f79\u5272<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-18\">\n<p>Pattern\u30af\u30e9\u30b9\u3068Matcher\u30af\u30e9\u30b9\u306f\u3001Java\u306e\u6b63\u898f\u8868\u73fe\u51e6\u7406\u306e\u4e2d\u6838\u3092\u62c5\u30462\u3064\u306e\u91cd\u8981\u306a\u30af\u30e9\u30b9\u3067\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-19\">\n<h4 class=\"wp-block-heading\" id=\"i-6\">Pattern\u30af\u30e9\u30b9<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-20\">\n<p>\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u3092\u30b3\u30f3\u30d1\u30a4\u30eb\u3057\u3001\u518d\u5229\u7528\u53ef\u80fd\u306a\u5f62\u5f0f\u3067\u4fdd\u6301\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">\/\/ Pattern\u30af\u30e9\u30b9\u306e\u57fa\u672c\u7684\u306a\u4f7f\u7528\u4f8b\nPattern pattern = Pattern.compile(\"\\\\d{3}-\\\\d{4}\"); \/\/ \u90f5\u4fbf\u756a\u53f7\u30d1\u30bf\u30fc\u30f3\n\/\/ \u30d1\u30bf\u30fc\u30f3\u306f\u518d\u5229\u7528\u53ef\u80fd\nMatcher matcher1 = pattern.matcher(\"123-4567\");\nMatcher matcher2 = pattern.matcher(\"234-5678\");<\/pre>\n\n\n<div id=\"sgb-css-id-21\">\n<h4 class=\"wp-block-heading\" id=\"i-7\">Matcher\u30af\u30e9\u30b9<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-22\">\n<p>\u5b9f\u969b\u306e\u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u30f3\u30b0\u51e6\u7406\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">\/\/ Matcher\u30af\u30e9\u30b9\u306e\u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\nPattern pattern = Pattern.compile(\"(\\\\d{3})-(\\\\d{4})\");\nMatcher matcher = pattern.matcher(\"123-4567\");\n\nif (matcher.matches()) {\n    String area = matcher.group(1);    \/\/ \"123\"\n    String local = matcher.group(2);   \/\/ \"4567\"\n    System.out.println(\"Area code: \" + area);\n    System.out.println(\"Local code: \" + local);\n}<\/pre>\n\n\n<div id=\"sgb-css-id-23\">\n<h3 class=\"wp-block-heading\" id=\"i-8\">1.3 matches()\u3068find()\u306e\u9055\u3044\u3092\u7406\u89e3\u3057\u3088\u3046<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-24\">\n<p>matches()\u3068find()\u306f\u3001\u7570\u306a\u308b\u76ee\u7684\u3067\u4f7f\u7528\u3055\u308c\u308b\u91cd\u8981\u306a\u30e1\u30bd\u30c3\u30c9\u3067\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-25\">\n<h4 class=\"wp-block-heading\" id=\"i-9\">\u4e3b\u306a\u9055\u3044\u306e\u6bd4\u8f03<\/h4>\n<\/div>\n\n<div id=\"id-00840705-e978-47ac-82fc-d71183fc9437\"><div id=\"sgb-css-id-26\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30e1\u30bd\u30c3\u30c9<\/th><th>\u52d5\u4f5c<\/th><th>\u4f7f\u7528\u30b1\u30fc\u30b9<\/th><\/tr><\/thead><tbody><tr><td>matches()<\/td><td>\u6587\u5b57\u5217\u5168\u4f53\u304c\u30d1\u30bf\u30fc\u30f3\u3068\u5b8c\u5168\u4e00\u81f4\u3059\u308b\u304b\u78ba\u8a8d<\/td><td>\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u691c\u8a3c\u306a\u3069<\/td><\/tr><tr><td>find()<\/td><td>\u30d1\u30bf\u30fc\u30f3\u306b\u4e00\u81f4\u3059\u308b\u90e8\u5206\u3092\u6587\u5b57\u5217\u5185\u3067\u691c\u7d22<\/td><td>\u30c7\u30fc\u30bf\u62bd\u51fa\u306a\u3069<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\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=\"\">\/\/ matches()\u3068find()\u306e\u9055\u3044\u3092\u793a\u3059\u4f8b\nPattern pattern = Pattern.compile(\"\\\\d+\");\nString text = \"ABC123DEF\";\n\nMatcher matcher = pattern.matcher(text);\nSystem.out.println(matcher.matches());  \/\/ false\uff08\u6587\u5b57\u5217\u5168\u4f53\u304c\u6570\u5b57\u3067\u306f\u306a\u3044\uff09\nSystem.out.println(matcher.find());     \/\/ true\uff08\u6587\u5b57\u5217\u5185\u306b\u6570\u5b57\u90e8\u5206\u304c\u5b58\u5728\u3059\u308b\uff09\n\n\/\/ \u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u4f8b\nPattern pattern2 = Pattern.compile(\"\\\\d+\");\nString text2 = \"ID:12345 Name:John Age:30\";\nMatcher matcher2 = pattern2.matcher(text2);\n\nwhile (matcher2.find()) {\n    System.out.println(\"Found number: \" + matcher2.group());\n}<\/pre>\n\n\n<div id=\"sgb-css-id-27\">\n<h4 class=\"wp-block-heading\" id=\"i-10\">\u4f7f\u3044\u5206\u3051\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-28\">\n<p>\u25cf <code>matches()<\/code><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-29\">\n<p>\u3000\u25cf \u30d5\u30a9\u30fc\u30e0\u5165\u529b\u306e\u691c\u8a3c<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-30\">\n<p>\u3000\u25cf \u30c7\u30fc\u30bf\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u78ba\u8a8d<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-31\">\n<p>\u3000\u25cf \u5b8c\u5168\u4e00\u81f4\u304c\u5fc5\u8981\u306a\u5834\u5408<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-32\">\n<p>\u25cf <code>find()<\/code><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-33\">\n<p>\u3000\u25cf \u30c6\u30ad\u30b9\u30c8\u304b\u3089\u306e\u60c5\u5831\u62bd\u51fa<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-34\">\n<p>\u3000\u25cf \u30ed\u30b0\u89e3\u6790<\/p>\n<\/div>\n\n\n<p>\u3000\u25cf \u90e8\u5206\u4e00\u81f4\u3067\u306e\u691c\u7d22\u304c\u5fc5\u8981\u306a\u5834\u5408<\/p>\n\n\n<div id=\"sgb-css-id-35\">\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306f\u6587\u5b57\u5217\u51e6\u7406\u306e\u5f37\u529b\u306a\u30c4\u30fc\u30eb\u3068\u3057\u3066\u3001\u69d8\u3005\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3067\u6d3b\u7528\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5\u306b\u3064\u3044\u3066\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-36\">\n<h2 class=\"wp-block-heading\" id=\"i-11\">\uff12\uff0e\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-37\">\n<h3 class=\"wp-block-heading\" id=\"i-12\">2.1 Pattern.compile\u3092\u4f7f\u7528\u3057\u305f\u57fa\u672c\u5b9f\u88c5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-38\">\n<p>Pattern.compile\u3092\u4f7f\u7528\u3059\u308b\u65b9\u6cd5\u306f\u3001\u6700\u3082\u67d4\u8edf\u3067\u518d\u5229\u7528\u6027\u306e\u9ad8\u3044\u5b9f\u88c5\u65b9\u6cd5\u3067\u3059\u3002\u30d1\u30bf\u30fc\u30f3\u3092\u4e00\u5ea6\u30b3\u30f3\u30d1\u30a4\u30eb\u3057\u3066\u518d\u5229\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6700\u9069\u5316\u3067\u304d\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">import java.util.regex.Pattern;\nimport java.util.regex.Matcher;\n\npublic class PatternCompileExample {\n    \/\/ \u30d1\u30bf\u30fc\u30f3\u3092\u30af\u30e9\u30b9\u5b9a\u6570\u3068\u3057\u3066\u5b9a\u7fa9\uff08\u518d\u5229\u7528\u6027\u304c\u9ad8\u3044\uff09\n    private static final Pattern EMAIL_PATTERN = \n        Pattern.compile(\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$\");\n\n    public boolean validateEmail(String email) {\n        if (email == null) {\n            return false;\n        }\n        \/\/ \u30b3\u30f3\u30d1\u30a4\u30eb\u6e08\u307f\u30d1\u30bf\u30fc\u30f3\u3092\u4f7f\u7528\u3057\u3066\u30de\u30c3\u30c1\u30f3\u30b0\n        return EMAIL_PATTERN.matcher(email).matches();\n    }\n\n    \/\/ \u8907\u6570\u306e\u5165\u529b\u3092\u691c\u8a3c\u3059\u308b\u4f8b\n    public void validateMultipleEmails(List&lt;String&gt; emails) {\n        for (String email : emails) {\n            \/\/ \u540c\u3058\u30d1\u30bf\u30fc\u30f3\u3092\u518d\u5229\u7528\u3057\u3066\u52b9\u7387\u7684\u306b\u691c\u8a3c\n            Matcher matcher = EMAIL_PATTERN.matcher(email);\n            System.out.println(email + \": \" + matcher.matches());\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-42\">\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:#009EF3;color:#FFF\" class=\"sgb-box-simple__title\">Pattern.compile\u306e\u30e1\u30ea\u30c3\u30c8<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:#009EF3;background-color:#FFF\">\n<ul class=\"wp-block-list\"><div id=\"sgb-css-id-39\">\n<li>\u30d1\u30bf\u30fc\u30f3\u306e\u518d\u5229\u7528\u304c\u53ef\u80fd<\/li>\n<\/div>\n\n<div id=\"sgb-css-id-40\">\n<li>\u30b9\u30ec\u30c3\u30c9\u30bb\u30fc\u30d5<\/li>\n<\/div>\n\n<div id=\"sgb-css-id-41\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u304c\u9ad8\u3044<\/li>\n<\/div>\n\n\n<li>\u8907\u96d1\u306a\u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u30f3\u30b0\u306b\u9069\u3057\u3066\u3044\u308b<\/li>\n<\/ul>\n<\/div><\/div>\n<\/div>\n\n<div id=\"sgb-css-id-43\">\n<h3 class=\"wp-block-heading\" id=\"i-13\">2.2 String.matches\u30e1\u30bd\u30c3\u30c9\u306b\u3088\u308b\u7c21\u6613\u5b9f\u88c5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-44\">\n<p>String.matches()\u306f\u3001\u7c21\u5358\u306a\u691c\u8a3c\u306b\u9069\u3057\u305f\u624b\u8efd\u306a\u5b9f\u88c5\u65b9\u6cd5\u3067\u3059\u3002\u305f\u3060\u3057\u3001\u5185\u90e8\u3067\u6bce\u56de\u30d1\u30bf\u30fc\u30f3\u3092\u30b3\u30f3\u30d1\u30a4\u30eb\u3059\u308b\u305f\u3081\u3001\u983b\u7e41\u306a\u4f7f\u7528\u306b\u306f\u5411\u3044\u3066\u3044\u307e\u305b\u3093\u3002<\/p>\n<\/div>\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=\"\">public class StringMatchesExample {\n    public boolean quickEmailCheck(String email) {\n        \/\/ \u5358\u7d14\u306a\u691c\u8a3c\u306e\u5834\u5408\u306f\u76f4\u63a5matches()\u3092\u4f7f\u7528\n        return email != null &amp;&amp; email.matches(\n            \"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$\"\n        );\n    }\n\n    \/\/ \u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u4f8b\n    public void validateUserInput() {\n        String phoneNumber = \"090-1234-5678\";\n        String zipCode = \"123-4567\";\n\n        \/\/ \u96fb\u8a71\u756a\u53f7\u306e\u691c\u8a3c\n        boolean isValidPhone = phoneNumber.matches(\"\\\\d{2,4}-\\\\d{2,4}-\\\\d{4}\");\n\n        \/\/ \u90f5\u4fbf\u756a\u53f7\u306e\u691c\u8a3c\n        boolean isValidZip = zipCode.matches(\"\\\\d{3}-\\\\d{4}\");\n\n        System.out.println(\"Phone: \" + isValidPhone);\n        System.out.println(\"Zip: \" + isValidZip);\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-47\">\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">String.matches\u306e\u4f7f\u7528\u5834\u9762<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<ul class=\"wp-block-list\"><div id=\"sgb-css-id-45\">\n<li>\u4e00\u5ea6\u304d\u308a\u306e\u7c21\u5358\u306a\u691c\u8a3c<\/li>\n<\/div>\n\n<div id=\"sgb-css-id-46\">\n<li>\u30d7\u30ed\u30c8\u30bf\u30a4\u30d7\u958b\u767a<\/li>\n<\/div>\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u304c\u91cd\u8981\u3067\u306a\u3044\u5834\u5408<\/li>\n<\/ul>\n<\/div><\/div>\n<\/div>\n\n<div id=\"sgb-css-id-48\">\n<h3 class=\"wp-block-heading\" id=\"i-14\">2.3 Matcher\u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u305f\u9ad8\u5ea6\u306a\u5b9f\u88c5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-49\">\n<p>Matcher\u30af\u30e9\u30b9\u306f\u3001\u3088\u308a\u8a73\u7d30\u306a\u6587\u5b57\u5217\u89e3\u6790\u3084\u8907\u96d1\u306a\u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u30f3\u30b0\u3092\u53ef\u80fd\u306b\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class AdvancedMatcherExample {\n    private static final Pattern LOG_PATTERN = \n        Pattern.compile(\"(\\\\d{4}-\\\\d{2}-\\\\d{2}) (\\\\d{2}:\\\\d{2}:\\\\d{2}) \\\\[(.+?)\\\\] (.+)\");\n\n    public void analyzeLogEntry(String logLine) {\n        Matcher matcher = LOG_PATTERN.matcher(logLine);\n\n        if (matcher.find()) {\n            \/\/ \u30b0\u30eb\u30fc\u30d7\u3092\u4f7f\u7528\u3057\u3066\u60c5\u5831\u3092\u62bd\u51fa\n            String date = matcher.group(1);\n            String time = matcher.group(2);\n            String level = matcher.group(3);\n            String message = matcher.group(4);\n\n            System.out.printf(\"Date: %s, Time: %s, Level: %s, Message: %s%n\",\n                            date, time, level, message);\n        }\n    }\n\n    \/\/ \u7f6e\u63db\u6a5f\u80fd\u3092\u4f7f\u7528\u3059\u308b\u4f8b\n    public String maskSensitiveData(String text) {\n        \/\/ \u30af\u30ec\u30b8\u30c3\u30c8\u30ab\u30fc\u30c9\u756a\u53f7\u3092\u30de\u30b9\u30af\n        Pattern cardPattern = Pattern.compile(\"\\\\d{4}-\\\\d{4}-\\\\d{4}-\\\\d{4}\");\n        Matcher cardMatcher = cardPattern.matcher(text);\n        String masked = cardMatcher.replaceAll(\"XXXX-XXXX-XXXX-$4\");\n\n        \/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u90e8\u5206\u7684\u306b\u30de\u30b9\u30af\n        Pattern emailPattern = Pattern.compile(\"([^@\\\\s]+)@([^\\\\s]+)\");\n        Matcher emailMatcher = emailPattern.matcher(masked);\n        return emailMatcher.replaceAll(\"$1@***\");\n    }\n\n    \/\/ \u8907\u6570\u306e\u30de\u30c3\u30c1\u3092\u51e6\u7406\u3059\u308b\u4f8b\n    public void findAllUrls(String text) {\n        Pattern urlPattern = Pattern.compile(\n            \"https?:\/\/[-a-zA-Z0-9+&amp;@#\/%?=~_|!:,.;]*[-a-zA-Z0-9+&amp;@#\/%=~_|]\"\n        );\n        Matcher matcher = urlPattern.matcher(text);\n\n        while (matcher.find()) {\n            System.out.println(\"Found URL: \" + matcher.group());\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-50\">\n<h4 class=\"wp-block-heading\" id=\"i-15\">Matcher\u30af\u30e9\u30b9\u306e\u9ad8\u5ea6\u306a\u6a5f\u80fd<\/h4>\n<\/div>\n\n<div id=\"id-9f53d210-50ad-47eb-a9c8-371fadce61c3\"><div id=\"sgb-css-id-51\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u6a5f\u80fd<\/th><th>\u30e1\u30bd\u30c3\u30c9<\/th><th>\u7528\u9014<\/th><\/tr><\/thead><tbody><tr><td>\u30b0\u30eb\u30fc\u30d7\u6355\u6349<\/td><td><code>group()<\/code><\/td><td>\u30d1\u30bf\u30fc\u30f3\u5185\u306e\u7279\u5b9a\u90e8\u5206\u3092\u62bd\u51fa<\/td><\/tr><tr><td>\u691c\u7d22\u4f4d\u7f6e\u5236\u5fa1<\/td><td><code>start(), end()<\/code><\/td><td>\u30de\u30c3\u30c1\u3057\u305f\u4f4d\u7f6e\u306e\u53d6\u5f97<\/td><\/tr><tr><td>\u7f6e\u63db<\/td><td><code>replaceAll(), replaceFirst()<\/code><\/td><td>\u30d1\u30bf\u30fc\u30f3\u306b\u4e00\u81f4\u3059\u308b\u7b87\u6240\u306e\u7f6e\u63db<\/td><\/tr><tr><td>\u53cd\u5fa9\u51e6\u7406<\/td><td><code>find()<\/code><\/td><td>\u8907\u6570\u306e\u30de\u30c3\u30c1\u3092\u9806\u6b21\u51e6\u7406<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-52\">\n<h4 class=\"wp-block-heading\" id=\"i-16\">\u5b9f\u88c5\u65b9\u6cd5\u306e\u9078\u629e\u57fa\u6e96<\/h4>\n<\/div>\n\n<div id=\"id-6fe6a23c-02f0-4a24-9718-2ab5ca13ba0d\"><div id=\"sgb-css-id-53\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u5b9f\u88c5\u65b9\u6cd5<\/th><th>\u63a8\u5968\u3055\u308c\u308b\u4f7f\u7528\u5834\u9762<\/th><th>\u6ce8\u610f\u70b9<\/th><\/tr><\/thead><tbody><tr><td>Pattern.compile<\/td><td>\u983b\u7e41\u306a\u691c\u8a3c\u304c\u5fc5\u8981\u306a\u5834\u5408<\/td><td>\u30d1\u30bf\u30fc\u30f3\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u304c\u5fc5\u8981<\/td><\/tr><tr><td>String.matches<\/td><td>\u5358\u767a\u306e\u7c21\u6613\u691c\u8a3c<\/td><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u6ce8\u610f<\/td><\/tr><tr><td>Matcher<\/td><td>\u8907\u96d1\u306a\u6587\u5b57\u5217\u51e6\u7406<\/td><td>\u9069\u5207\u306a\u30d1\u30bf\u30fc\u30f3\u8a2d\u8a08\u304c\u91cd\u8981<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-54\">\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u7528\u9014\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u5b9f\u88c5\u65b9\u6cd5\u3092\u9078\u629e\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30b3\u30fc\u30c9\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u969b\u306b\u3088\u304f\u4f7f\u7528\u3055\u308c\u308b\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u306b\u3064\u3044\u3066\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-55\">\n<h2 class=\"wp-block-heading\" id=\"i-17\">\uff13\uff0e\u3088\u304f\u4f7f\u3046\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u96c6<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-56\">\n<h3 class=\"wp-block-heading\" id=\"i-18\">3.1 \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u691c\u8a3c\u30d1\u30bf\u30fc\u30f3<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-57\">\n<p>\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u691c\u8a3c\u306f\u6700\u3082\u4e00\u822c\u7684\u306a\u7528\u9014\u306e1\u3064\u3067\u3059\u304c\u3001RFC\u6e96\u62e0\u306e\u5b8c\u5168\u306a\u691c\u8a3c\u306f\u8907\u96d1\u306b\u306a\u308a\u304c\u3061\u3067\u3059\u3002\u5b9f\u7528\u7684\u306a\u30d0\u30e9\u30f3\u30b9\u3092\u8003\u616e\u3057\u305f\u5b9f\u88c5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class EmailValidationPatterns {\n    \/\/ \u57fa\u672c\u7684\u306a\u5b9f\u88c5\uff08\u30b7\u30f3\u30d7\u30eb\u306a\u691c\u8a3c\uff09\n    private static final Pattern SIMPLE_EMAIL = \n        Pattern.compile(\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$\");\n\n    \/\/ \u3088\u308a\u53b3\u5bc6\u306a\u5b9f\u88c5\uff08RFC\u6e96\u62e0\u306b\u3088\u308a\u8fd1\u3044\uff09\n    private static final Pattern STRICT_EMAIL = Pattern.compile(\n        \"^[a-zA-Z0-9.!#$%&amp;'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}\" +\n        \"[a-zA-Z0-9])?(?:\\\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\"\n    );\n\n    public boolean validateEmail(String email, boolean strict) {\n        if (email == null) {\n            return false;\n        }\n        \/\/ \u9577\u3055\u30c1\u30a7\u30c3\u30af\n        if (email.length() &gt; 254) {\n            return false;\n        }\n        return strict ? \n            STRICT_EMAIL.matcher(email).matches() :\n            SIMPLE_EMAIL.matcher(email).matches();\n    }\n\n    \/\/ \u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\n    public void runEmailTests() {\n        String[] validEmails = {\n            \"user@example.com\",\n            \"user.name@example.co.jp\",\n            \"user+label@example.com\"\n        };\n\n        String[] invalidEmails = {\n            \"user@\",\n            \"@example.com\",\n            \"user@.com\",\n            \"user@example\",\n            \"user name@example.com\"\n        };\n\n        \/\/ \u30c6\u30b9\u30c8\u5b9f\u884c\n        for (String email : validEmails) {\n            assert validateEmail(email, false) : \"Valid email failed: \" + email;\n        }\n\n        for (String email : invalidEmails) {\n            assert !validateEmail(email, false) : \"Invalid email passed: \" + email;\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-60\">\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:#ffb36b;color:#FFF\" class=\"sgb-box-simple__title\">\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u30d1\u30bf\u30fc\u30f3\u306e\u6ce8\u610f\u70b9<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:#ffb36b;background-color:#FFF\">\n<ul class=\"wp-block-list\"><div id=\"sgb-css-id-58\">\n<li>\u5b8c\u5168\u306aRFC\u6e96\u62e0\u306f\u73fe\u5b9f\u7684\u3067\u306a\u3044\u5834\u5408\u304c\u591a\u3044<\/li>\n<\/div>\n\n<div id=\"sgb-css-id-59\">\n<li>\u30c9\u30e1\u30a4\u30f3\u90e8\u5206\u306e\u9577\u3055\u5236\u9650\u3092\u8003\u616e<\/li>\n<\/div>\n\n\n<li>\u56fd\u969b\u5316\u30c9\u30e1\u30a4\u30f3\u306e\u5bfe\u5fdc\u304c\u5fc5\u8981\u306a\u5834\u5408\u306f\u5225\u9014\u8003\u616e<\/li>\n<\/ul>\n<\/div><\/div>\n<\/div>\n\n<div id=\"sgb-css-id-61\">\n<h3 class=\"wp-block-heading\" id=\"i-19\">3.2 \u96fb\u8a71\u756a\u53f7\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u30c1\u30a7\u30c3\u30af<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-62\">\n<p>\u96fb\u8a71\u756a\u53f7\u306f\u56fd\u3084\u5730\u57df\u306b\u3088\u3063\u3066\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u304c\u7570\u306a\u308b\u305f\u3081\u3001\u7528\u9014\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u30d1\u30bf\u30fc\u30f3\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class PhoneNumberValidationPatterns {\n    \/\/ \u65e5\u672c\u306e\u96fb\u8a71\u756a\u53f7\u30d1\u30bf\u30fc\u30f3\n    private static final Pattern JP_PHONE = Pattern.compile(\n        \"^(0\\\\d{1,4})-?(\\\\d{1,4})-?(\\\\d{4})$\"\n    );\n\n    \/\/ \u56fd\u969b\u96fb\u8a71\u756a\u53f7\u30d1\u30bf\u30fc\u30f3\uff08\u30b7\u30f3\u30d7\u30eb\u306a\u5b9f\u88c5\uff09\n    private static final Pattern INTERNATIONAL_PHONE = Pattern.compile(\n        \"^\\\\+(?:[0-9] ?){6,14}[0-9]$\"\n    );\n\n    public static class PhoneValidationResult {\n        public final boolean isValid;\n        public final String formattedNumber;\n\n        public PhoneValidationResult(boolean isValid, String formattedNumber) {\n            this.isValid = isValid;\n            this.formattedNumber = formattedNumber;\n        }\n    }\n\n    public PhoneValidationResult validateJapanesePhone(String phone) {\n        if (phone == null) {\n            return new PhoneValidationResult(false, null);\n        }\n\n        \/\/ \u30cf\u30a4\u30d5\u30f3\u3068\u7a7a\u767d\u3092\u9664\u53bb\n        String cleanPhone = phone.replaceAll(\"[- ]\", \"\");\n        Matcher matcher = JP_PHONE.matcher(cleanPhone);\n\n        if (matcher.matches()) {\n            \/\/ \u6b63\u898f\u5316\u3055\u308c\u305f\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306b\u5909\u63db\n            String formatted = String.format(\"%s-%s-%s\",\n                matcher.group(1),\n                matcher.group(2),\n                matcher.group(3)\n            );\n            return new PhoneValidationResult(true, formatted);\n        }\n\n        return new PhoneValidationResult(false, null);\n    }\n\n    \/\/ \u5b9f\u88c5\u4f8b\u306e\u4f7f\u7528\u65b9\u6cd5\n    public void demonstratePhoneValidation() {\n        String[] testPhones = {\n            \"03-1234-5678\",\n            \"090-1234-5678\",\n            \"0123-12-3456\",\n            \"090-123-45678\",  \/\/ \u4e0d\u6b63\u306a\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\n            \"1234-567-890\"    \/\/ \u4e0d\u6b63\u306a\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\n        };\n\n        for (String phone : testPhones) {\n            PhoneValidationResult result = validateJapanesePhone(phone);\n            System.out.printf(\"Number: %s, Valid: %b, Formatted: %s%n\",\n                phone, result.isValid, result.formattedNumber);\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-63\">\n<h4 class=\"wp-block-heading\" id=\"i-20\">\u96fb\u8a71\u756a\u53f7\u30d1\u30bf\u30fc\u30f3\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"id-789eeb1b-fa27-4f96-8331-ceb4d47f04d6\"><div id=\"sgb-css-id-64\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u8003\u616e\u70b9<\/th><th>\u5bfe\u5fdc\u65b9\u6cd5<\/th><\/tr><\/thead><tbody><tr><td>\u5e02\u5916\u5c40\u756a\u306e\u6841\u6570<\/td><td>\u53ef\u5909\u9577\u306b\u5bfe\u5fdc<\/td><\/tr><tr><td>\u643a\u5e2f\u96fb\u8a71\u756a\u53f7<\/td><td>090\/080\/070\u306e\u30d1\u30bf\u30fc\u30f3<\/td><\/tr><tr><td>\u56fd\u969b\u5bfe\u5fdc<\/td><td>\u56fd\u30b3\u30fc\u30c9\u5bfe\u5fdc<\/td><\/tr><tr><td>\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u6b63\u898f\u5316<\/td><td>\u30cf\u30a4\u30d5\u30f3\u4f4d\u7f6e\u306e\u7d71\u4e00<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-65\">\n<h3 class=\"wp-block-heading\" id=\"i-21\">3.3 \u65e5\u4ed8\u5f62\u5f0f\u306e\u691c\u8a3c\u30d1\u30bf\u30fc\u30f3<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-66\">\n<p>\u65e5\u4ed8\u5f62\u5f0f\u306e\u691c\u8a3c\u306f\u3001\u5358\u7d14\u306a\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u30c1\u30a7\u30c3\u30af\u3060\u3051\u3067\u306a\u304f\u3001\u5b9f\u5728\u3059\u308b\u65e5\u4ed8\u304b\u3069\u3046\u304b\u306e\u691c\u8a3c\u3082\u91cd\u8981\u3067\u3059\u3002<\/p>\n<\/div>\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=\"\">public class DateValidationPatterns {\n    \/\/ \u57fa\u672c\u7684\u306a\u65e5\u4ed8\u30d1\u30bf\u30fc\u30f3\uff08YYYY-MM-DD\uff09\n    private static final Pattern ISO_DATE = \n        Pattern.compile(\"^\\\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\\\d|3[01])$\");\n\n    \/\/ \u65e5\u672c\u5f62\u5f0f\u306e\u65e5\u4ed8\u30d1\u30bf\u30fc\u30f3\uff08YYYY\/MM\/DD\uff09\n    private static final Pattern JP_DATE = \n        Pattern.compile(\"^\\\\d{4}\/(?:0[1-9]|1[0-2])\/(?:0[1-9]|[12]\\\\d|3[01])$\");\n\n    public class DateValidationResult {\n        public final boolean isValid;\n        public final LocalDate parsedDate;\n\n        public DateValidationResult(boolean isValid, LocalDate parsedDate) {\n            this.isValid = isValid;\n            this.parsedDate = parsedDate;\n        }\n    }\n\n    public DateValidationResult validateDate(String dateStr, String pattern) {\n        \/\/ \u30d1\u30bf\u30fc\u30f3\u306b\u3088\u3063\u3066\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092\u5207\u308a\u66ff\u3048\n        Pattern datePattern = pattern.equals(\"ISO\") ? ISO_DATE : JP_DATE;\n\n        if (!datePattern.matcher(dateStr).matches()) {\n            return new DateValidationResult(false, null);\n        }\n\n        try {\n            \/\/ DateTimeFormatter\u3092\u4f7f\u7528\u3057\u3066\u65e5\u4ed8\u306e\u59a5\u5f53\u6027\u3092\u691c\u8a3c\n            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(\n                pattern.equals(\"ISO\") ? \"yyyy-MM-dd\" : \"yyyy\/MM\/dd\"\n            );\n            LocalDate date = LocalDate.parse(dateStr, formatter);\n\n            \/\/ \u73fe\u5728\u65e5\u4ed8\u3068\u306e\u6bd4\u8f03\u306a\u3069\u306e\u8ffd\u52a0\u30c1\u30a7\u30c3\u30af\n            if (date.isAfter(LocalDate.now().plusYears(100))) {\n                return new DateValidationResult(false, null);\n            }\n\n            return new DateValidationResult(true, date);\n        } catch (DateTimeException e) {\n            return new DateValidationResult(false, null);\n        }\n    }\n\n    \/\/ \u5b9f\u88c5\u4f8b\u306e\u4f7f\u7528\u65b9\u6cd5\n    public void demonstrateDateValidation() {\n        String[] testDates = {\n            \"2024-02-29\",  \/\/ \u3046\u308b\u3046\u5e74\n            \"2024-04-31\",  \/\/ \u7121\u52b9\u306a\u65e5\u4ed8\n            \"2024\/12\/31\",  \/\/ \u65e5\u672c\u5f62\u5f0f\n            \"2024-13-01\",  \/\/ \u7121\u52b9\u306a\u6708\n            \"2024-00-01\"   \/\/ \u7121\u52b9\u306a\u6708\n        };\n\n        for (String date : testDates) {\n            String pattern = date.contains(\"-\") ? \"ISO\" : \"JP\";\n            DateValidationResult result = validateDate(date, pattern);\n            System.out.printf(\"Date: %s, Valid: %b, Parsed: %s%n\",\n                date, result.isValid, \n                result.parsedDate != null ? result.parsedDate : \"N\/A\");\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-67\">\n<h4 class=\"wp-block-heading\" id=\"i-22\">\u65e5\u4ed8\u30d1\u30bf\u30fc\u30f3\u306e\u6ce8\u610f\u70b9<\/h4>\n<\/div>\n\n<div id=\"id-ed364276-a238-4ba3-a3e6-f4618189cdea\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u691c\u8a3c\u9805\u76ee<\/th><th>\u8aac\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u691c\u8a3c<\/td><td>\u6b63\u898f\u8868\u73fe\u306b\u3088\u308b\u57fa\u672c\u30c1\u30a7\u30c3\u30af<\/td><\/tr><tr><td>\u65e5\u4ed8\u306e\u59a5\u5f53\u6027<\/td><td>\u3046\u308b\u3046\u5e74\u3001\u6708\u672b\u65e5\u306e\u8003\u616e<\/td><\/tr><tr><td>\u7bc4\u56f2\u30c1\u30a7\u30c3\u30af<\/td><td>\u9069\u5207\u306a\u65e5\u4ed8\u7bc4\u56f2\u306e\u5236\u9650<\/td><\/tr><tr><td>\u30bf\u30a4\u30e0\u30be\u30fc\u30f3<\/td><td>\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u8003\u616e<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n<div id=\"sgb-css-id-68\">\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u5404\u7528\u9014\u306b\u5fdc\u3058\u305f\u9069\u5207\u306a\u30d1\u30bf\u30fc\u30f3\u3092\u9078\u629e\u3057\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u3053\u3068\u3067\u3001\u4fe1\u983c\u6027\u306e\u9ad8\u3044\u691c\u8a3c\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u3064\u3044\u3066\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-69\">\n<h2 class=\"wp-block-heading\" id=\"i-23\">\uff14\uff0e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-70\">\n<h3 class=\"wp-block-heading\" id=\"i-24\">4.1 Pattern.compile\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-71\">\n<p>Pattern.compile\u306f\u6bd4\u8f03\u7684\u30b3\u30b9\u30c8\u306e\u9ad8\u3044\u64cd\u4f5c\u3067\u3042\u308a\u3001\u540c\u3058\u30d1\u30bf\u30fc\u30f3\u3092\u7e70\u308a\u8fd4\u3057\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u30ad\u30e3\u30c3\u30b7\u30e5\u304c\u52b9\u679c\u7684\u3067\u3059\u3002<\/p>\n<\/div>\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=\"\">public class PatternCache {\n    \/\/ \u30d1\u30bf\u30fc\u30f3\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3059\u308b\u305f\u3081\u306eThreadSafe\u306a\u5b9f\u88c5\n    private static final class PatternCacheHolder {\n        private static final Map&lt;String, Pattern&gt; PATTERN_CACHE = \n            new ConcurrentHashMap&lt;&gt;();\n\n        private static final int MAX_CACHE_SIZE = 1000;  \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u30b5\u30a4\u30ba\u306e\u5236\u9650\n\n        private PatternCacheHolder() {}\n\n        public static Pattern getPattern(String regex, int flags) {\n            \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u30ad\u30fc\u306e\u751f\u6210\n            String cacheKey = flags == 0 ? regex : regex + \"#\" + flags;\n\n            \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u304b\u3089\u30d1\u30bf\u30fc\u30f3\u3092\u53d6\u5f97\u3001\u306a\u3051\u308c\u3070\u65b0\u898f\u4f5c\u6210\n            return PATTERN_CACHE.computeIfAbsent(cacheKey, k -&gt; {\n                \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u30b5\u30a4\u30ba\u3092\u30c1\u30a7\u30c3\u30af\n                if (PATTERN_CACHE.size() &gt;= MAX_CACHE_SIZE) {\n                    \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u304c\u4e00\u676f\u306e\u5834\u5408\u306f\u53e4\u3044\u30a8\u30f3\u30c8\u30ea\u3092\u524a\u9664\n                    PATTERN_CACHE.clear();\n                }\n                return Pattern.compile(regex, flags);\n            });\n        }\n    }\n\n    \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u4f7f\u7528\u3057\u305f\u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u30f3\u30b0\n    public static boolean matches(String input, String regex) {\n        Pattern pattern = PatternCacheHolder.getPattern(regex, 0);\n        return pattern.matcher(input).matches();\n    }\n\n    \/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6bd4\u8f03\u30c7\u30e2\n    public void demonstratePerformance() {\n        String regex = \"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$\";\n        String testInput = \"test@example.com\";\n\n        \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306a\u3057\u306e\u5834\u5408\n        long startTime = System.nanoTime();\n        for (int i = 0; i &lt; 10000; i++) {\n            Pattern.compile(regex).matcher(testInput).matches();\n        }\n        long noCacheTime = System.nanoTime() - startTime;\n\n        \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u3042\u308a\u306e\u5834\u5408\n        startTime = System.nanoTime();\n        for (int i = 0; i &lt; 10000; i++) {\n            matches(testInput, regex);\n        }\n        long withCacheTime = System.nanoTime() - startTime;\n\n        System.out.printf(\"No Cache: %d ns%nWith Cache: %d ns%n\" +\n                         \"Performance improvement: %.2f%%%n\",\n            noCacheTime, withCacheTime,\n            ((noCacheTime - withCacheTime) \/ (double)noCacheTime) * 100);\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-72\">\n<h4 class=\"wp-block-heading\" id=\"i-25\">\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"id-b257ff2d-3b76-4944-9ceb-4c468b5fb9f7\"><div id=\"sgb-css-id-73\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u8003\u616e\u70b9<\/th><th>\u5bfe\u5fdc\u7b56<\/th><\/tr><\/thead><tbody><tr><td>\u30b9\u30ec\u30c3\u30c9\u30bb\u30fc\u30d5\u30c6\u30a3<\/td><td>ConcurrentHashMap\u306e\u4f7f\u7528<\/td><\/tr><tr><td>\u30e1\u30e2\u30ea\u7ba1\u7406<\/td><td>\u30ad\u30e3\u30c3\u30b7\u30e5\u30b5\u30a4\u30ba\u306e\u5236\u9650<\/td><\/tr><tr><td>\u30ad\u30e3\u30c3\u30b7\u30e5\u30ad\u30fc<\/td><td>\u30d5\u30e9\u30b0\u3092\u8003\u616e\u3057\u305f\u30ad\u30fc\u8a2d\u8a08<\/td><\/tr><tr><td>\u30ad\u30e3\u30c3\u30b7\u30e5\u66f4\u65b0<\/td><td>\u5fc5\u8981\u306b\u5fdc\u3058\u305f\u53e4\u3044\u30a8\u30f3\u30c8\u30ea\u306e\u524a\u9664<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-74\">\n<h3 class=\"wp-block-heading\" id=\"i-26\">4.2 ReDoS\u653b\u6483\u3092\u9632\u3050\u305f\u3081\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-75\">\n<p>ReDoS\uff08Regular Expression Denial of Service\uff09\u306f\u3001\u7279\u5b9a\u306e\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u3067\u51e6\u7406\u6642\u9593\u304c\u6307\u6570\u95a2\u6570\u7684\u306b\u5897\u52a0\u3059\u308b\u8106\u5f31\u6027\u3067\u3059\u3002<\/p>\n<\/div>\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=\"\">public class ReDoSPrevention {\n    \/\/ \u8106\u5f31\u306a\u30d1\u30bf\u30fc\u30f3\u306e\u4f8b\u3068\u5b89\u5168\u306a\u30d1\u30bf\u30fc\u30f3\u306e\u6bd4\u8f03\n    public static class EmailValidator {\n        \/\/ \u8106\u5f31\u306a\u5b9f\u88c5\uff08\u30d0\u30c3\u30af\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u306e\u554f\u984c\u3042\u308a\uff09\n        private static final Pattern VULNERABLE_EMAIL = Pattern.compile(\n            \"^([a-zA-Z0-9]+.*)+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$\"\n        );\n\n        \/\/ \u5b89\u5168\u306a\u5b9f\u88c5\n        private static final Pattern SAFE_EMAIL = Pattern.compile(\n            \"^[a-zA-Z0-9](?:[a-zA-Z0-9._%+-]{0,61}[a-zA-Z0-9])?@\" +\n            \"[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\\\.[a-zA-Z]{2,})+$\"\n        );\n\n        \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u4ed8\u304d\u306e\u691c\u8a3c\u5b9f\u88c5\n        public static boolean validateEmailWithTimeout(\n            String email, Pattern pattern, long timeoutMillis) {\n\n            FutureTask&lt;Boolean&gt; task = new FutureTask&lt;&gt;(() -&gt;\n                pattern.matcher(email).matches()\n            );\n\n            Thread thread = new Thread(task);\n            thread.start();\n\n            try {\n                return task.get(timeoutMillis, TimeUnit.MILLISECONDS);\n            } catch (TimeoutException e) {\n                thread.interrupt();\n                System.out.println(\"Pattern matching timed out - possible ReDoS attempt\");\n                return false;\n            } catch (Exception e) {\n                return false;\n            }\n        }\n\n        \/\/ \u5b9f\u88c5\u306e\u6bd4\u8f03\u30c7\u30e2\n        public void demonstrateReDoS() {\n            \/\/ \u60aa\u610f\u306e\u3042\u308b\u5165\u529b\u306e\u4f8b\n            String maliciousInput = \"a\".repeat(100) + \"@example.com\";\n\n            \/\/ \u8106\u5f31\u306a\u30d1\u30bf\u30fc\u30f3\u3068\u5b89\u5168\u306a\u30d1\u30bf\u30fc\u30f3\u306e\u5b9f\u884c\u6642\u9593\u3092\u6bd4\u8f03\n            long startTime = System.currentTimeMillis();\n            validateEmailWithTimeout(maliciousInput, VULNERABLE_EMAIL, 1000);\n            long vulnerableTime = System.currentTimeMillis() - startTime;\n\n            startTime = System.currentTimeMillis();\n            validateEmailWithTimeout(maliciousInput, SAFE_EMAIL, 1000);\n            long safeTime = System.currentTimeMillis() - startTime;\n\n            System.out.printf(\"Vulnerable pattern: %d ms%nSafe pattern: %d ms%n\",\n                            vulnerableTime, safeTime);\n        }\n    }\n\n    \/\/ ReDoS\u5bfe\u7b56\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\n    public static class RegexSafety {\n        \/\/ \u5165\u529b\u306e\u9577\u3055\u3092\u5236\u9650\n        public static boolean safeMatch(String input, Pattern pattern, int maxLength) {\n            if (input == null || input.length() &gt; maxLength) {\n                return false;\n            }\n            return pattern.matcher(input).matches();\n        }\n\n        \/\/ \u30d1\u30bf\u30fc\u30f3\u306e\u8907\u96d1\u3055\u3092\u5236\u9650\n        public static Pattern createSafePattern(String regex, int maxGroups) {\n            \/\/ \u30b0\u30eb\u30fc\u30d7\u306e\u6570\u3092\u30ab\u30a6\u30f3\u30c8\n            long groupCount = regex.chars().filter(ch -&gt; ch == '(').count();\n            if (groupCount &gt; maxGroups) {\n                throw new IllegalArgumentException(\n                    \"Pattern contains too many groups: \" + groupCount);\n            }\n            return Pattern.compile(regex);\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-76\">\n<h4 class=\"wp-block-heading\" id=\"i-27\">ReDoS\u5bfe\u7b56\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"id-1c312e88-7aff-40a8-940f-e8d7802b0bd0\"><div id=\"sgb-css-id-77\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u5bfe\u7b56<\/th><th>\u8aac\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u30d1\u30bf\u30fc\u30f3\u6700\u9069\u5316<\/td><td>\u904e\u5ea6\u306a\u5165\u308c\u5b50\u3084\u7e70\u308a\u8fd4\u3057\u3092\u907f\u3051\u308b<\/td><\/tr><tr><td>\u5165\u529b\u5236\u9650<\/td><td>\u6587\u5b57\u5217\u9577\u306e\u5236\u9650\u3092\u8a2d\u3051\u308b<\/td><\/tr><tr><td>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8<\/td><td>\u51e6\u7406\u6642\u9593\u306b\u5236\u9650\u3092\u8a2d\u3051\u308b<\/td><\/tr><tr><td>\u9759\u7684\u89e3\u6790<\/td><td>\u30d1\u30bf\u30fc\u30f3\u306e\u8907\u96d1\u3055\u3092\u30c1\u30a7\u30c3\u30af<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-78\">\n<h3 class=\"wp-block-heading\" id=\"i-28\">4.3 \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306eTips<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-79\">\n<p>\u6b63\u898f\u8868\u73fe\u51e6\u7406\u306e\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6700\u9069\u5316\u3059\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b89\u5b9a\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class MemoryOptimization {\n    \/\/ \u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u5b9f\u88c5\u4f8b\n    public static class StreamProcessor {\n        private static final Pattern WORD_PATTERN = Pattern.compile(\"\\\\w+\");\n        private static final int BUFFER_SIZE = 8192;\n\n        \/\/ \u5927\u304d\u306a\u30c6\u30ad\u30b9\u30c8\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\n        public void processLargeText(Reader input) throws IOException {\n            BufferedReader reader = new BufferedReader(input);\n            char[] buffer = new char[BUFFER_SIZE];\n            StringBuilder remainder = new StringBuilder();\n            int read;\n\n            while ((read = reader.read(buffer)) != -1) {\n                \/\/ \u30d0\u30c3\u30d5\u30a1\u306e\u5185\u5bb9\u3092\u51e6\u7406\n                String chunk = remainder.toString() + new String(buffer, 0, read);\n                Matcher matcher = WORD_PATTERN.matcher(chunk);\n\n                int lastEnd = 0;\n                while (matcher.find()) {\n                    \/\/ \u5358\u8a9e\u3092\u51e6\u7406\n                    processWord(matcher.group());\n                    lastEnd = matcher.end();\n                }\n\n                \/\/ \u672a\u51e6\u7406\u306e\u90e8\u5206\u3092\u4fdd\u6301\n                remainder = new StringBuilder(chunk.substring(lastEnd));\n            }\n        }\n\n        private void processWord(String word) {\n            \/\/ \u5358\u8a9e\u306e\u51e6\u7406\u30ed\u30b8\u30c3\u30af\n            System.out.println(\"Processing: \" + word);\n        }\n    }\n\n    \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\n    public static class MemoryMonitor {\n        public static void printMemoryUsage(String label) {\n            Runtime runtime = Runtime.getRuntime();\n            long totalMemory = runtime.totalMemory();\n            long freeMemory = runtime.freeMemory();\n            long usedMemory = totalMemory - freeMemory;\n\n            System.out.printf(\"%s - Used Memory: %d MB%n\",\n                label, usedMemory \/ (1024 * 1024));\n        }\n    }\n\n    \/\/ \u30e1\u30e2\u30ea\u6700\u9069\u5316\u306e\u30c7\u30e2\n    public void demonstrateMemoryOptimization() {\n        MemoryMonitor.printMemoryUsage(\"Before processing\");\n\n        try {\n            \/\/ \u5927\u304d\u306a\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\n            String largeText = generateLargeText();\n            StreamProcessor processor = new StreamProcessor();\n            processor.processLargeText(new StringReader(largeText));\n\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n\n        MemoryMonitor.printMemoryUsage(\"After processing\");\n    }\n\n    private String generateLargeText() {\n        \/\/ \u30c6\u30b9\u30c8\u7528\u306e\u5927\u304d\u306a\u30c6\u30ad\u30b9\u30c8\u3092\u751f\u6210\n        StringBuilder sb = new StringBuilder();\n        for (int i = 0; i &lt; 100000; i++) {\n            sb.append(\"word\").append(i).append(\" \");\n        }\n        return sb.toString();\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-80\">\n<h4 class=\"wp-block-heading\" id=\"i-29\">\u30e1\u30e2\u30ea\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"id-627ef69b-04f5-4d22-9403-4e52dd173db6\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u65bd\u7b56<\/th><th>\u52b9\u679c<\/th><\/tr><\/thead><tbody><tr><td>\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0<\/td><td>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u5e73\u6e96\u5316<\/td><\/tr><tr><td>\u30b9\u30c8\u30ea\u30fc\u30e0\u51e6\u7406<\/td><td>\u5927\u304d\u306a\u30c7\u30fc\u30bf\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406<\/td><\/tr><tr><td>\u30ad\u30e3\u30c3\u30b7\u30e5\u5236\u5fa1<\/td><td>\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u306e\u9632\u6b62<\/td><\/tr><tr><td>\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u518d\u5229\u7528<\/td><td>GC\u8ca0\u8377\u306e\u524a\u6e1b<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n<div id=\"sgb-css-id-81\">\n<p>\u3053\u308c\u3089\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u6700\u9069\u5316\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u3067\u52b9\u7387\u7684\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\u3053\u308c\u3089\u306e\u77e5\u8b58\u3092\u6d3b\u7528\u3057\u305f\u5b9f\u8df5\u7684\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5\u4f8b\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-82\">\n<h2 class=\"wp-block-heading\" id=\"i-30\">\uff15\uff0e\u5b9f\u8df5\u7684\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5\u4f8b<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-83\">\n<h3 class=\"wp-block-heading\" id=\"i-31\">5.1 \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30af\u30e9\u30b9\u306e\u8a2d\u8a08\u65b9\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-84\">\n<p>\u518d\u5229\u7528\u53ef\u80fd\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30af\u30e9\u30b9\u3092\u8a2d\u8a08\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class ValidationFramework {\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u7d50\u679c\u3092\u8868\u3059\u30af\u30e9\u30b9\n    public static class ValidationResult {\n        private final boolean valid;\n        private final List&lt;String&gt; errors;\n\n        public ValidationResult(boolean valid, List&lt;String&gt; errors) {\n            this.valid = valid;\n            this.errors = Collections.unmodifiableList(\n                new ArrayList&lt;&gt;(errors));\n        }\n\n        public boolean isValid() { return valid; }\n        public List&lt;String&gt; getErrors() { return errors; }\n    }\n\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30eb\u30fc\u30eb\u306e\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\n    @FunctionalInterface\n    public interface ValidationRule&lt;T&gt; {\n        ValidationResult validate(T value);\n    }\n\n    \/\/ \u6c4e\u7528\u7684\u306a\u30d0\u30ea\u30c7\u30fc\u30bf\u30af\u30e9\u30b9\n    public static class Validator&lt;T&gt; {\n        private final List&lt;ValidationRule&lt;T&gt;&gt; rules = new ArrayList&lt;&gt;();\n        private final Map&lt;String, Pattern&gt; patternCache = new ConcurrentHashMap&lt;&gt;();\n\n        \/\/ \u30eb\u30fc\u30eb\u306e\u8ffd\u52a0\n        public Validator&lt;T&gt; addRule(ValidationRule&lt;T&gt; rule) {\n            rules.add(rule);\n            return this;\n        }\n\n        \/\/ \u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u306e\u8ffd\u52a0\n        public Validator&lt;T&gt; addPattern(String name, String regex) {\n            patternCache.put(name, Pattern.compile(regex));\n            return this;\n        }\n\n        \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\n        public ValidationResult validate(T value) {\n            List&lt;String&gt; errors = new ArrayList&lt;&gt;();\n\n            for (ValidationRule&lt;T&gt; rule : rules) {\n                ValidationResult result = rule.validate(value);\n                if (!result.isValid()) {\n                    errors.addAll(result.getErrors());\n                }\n            }\n\n            return new ValidationResult(errors.isEmpty(), errors);\n        }\n\n        \/\/ \u30d1\u30bf\u30fc\u30f3\u306b\u3088\u308b\u6587\u5b57\u5217\u691c\u8a3c\n        protected boolean matchesPattern(String value, String patternName) {\n            Pattern pattern = patternCache.get(patternName);\n            return pattern != null &amp;&amp; pattern.matcher(value).matches();\n        }\n    }\n\n    \/\/ \u30e6\u30fc\u30b6\u30fc\u30c7\u30fc\u30bf\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u4f8b\n    public static class UserDataValidator extends Validator&lt;UserData&gt; {\n        public UserDataValidator() {\n            \/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u30d1\u30bf\u30fc\u30f3\n            addPattern(\"email\", \n                \"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$\");\n\n            \/\/ \u96fb\u8a71\u756a\u53f7\u30d1\u30bf\u30fc\u30f3\n            addPattern(\"phone\", \"^\\\\d{2,4}-\\\\d{2,4}-\\\\d{4}$\");\n\n            \/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u691c\u8a3c\u30eb\u30fc\u30eb\n            addRule(userData -&gt; {\n                if (userData.getEmail() == null || \n                    !matchesPattern(userData.getEmail(), \"email\")) {\n                    return new ValidationResult(false, \n                        Collections.singletonList(\"Invalid email format\"));\n                }\n                return new ValidationResult(true, Collections.emptyList());\n            });\n\n            \/\/ \u96fb\u8a71\u756a\u53f7\u306e\u691c\u8a3c\u30eb\u30fc\u30eb\n            addRule(userData -&gt; {\n                if (userData.getPhone() != null &amp;&amp; \n                    !userData.getPhone().isEmpty() &amp;&amp; \n                    !matchesPattern(userData.getPhone(), \"phone\")) {\n                    return new ValidationResult(false, \n                        Collections.singletonList(\"Invalid phone format\"));\n                }\n                return new ValidationResult(true, Collections.emptyList());\n            });\n        }\n    }\n\n    \/\/ \u4f7f\u7528\u4f8b\n    public static void demonstrateValidation() {\n        UserData userData = new UserData(\n            \"invalid-email\",\n            \"invalid-phone\"\n        );\n\n        UserDataValidator validator = new UserDataValidator();\n        ValidationResult result = validator.validate(userData);\n\n        if (!result.isValid()) {\n            result.getErrors().forEach(System.out::println);\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-85\">\n<h4 class=\"wp-block-heading\" id=\"i-32\">\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30af\u30e9\u30b9\u8a2d\u8a08\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"id-650c2e59-3aeb-4210-9289-b2edeeb00d97\"><div id=\"sgb-css-id-86\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u8a2d\u8a08\u30dd\u30a4\u30f3\u30c8<\/th><th>\u8aac\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u8cac\u4efb\u306e\u5206\u96e2<\/td><td>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30ed\u30b8\u30c3\u30af\u3092\u72ec\u7acb\u3057\u305f\u30af\u30e9\u30b9\u306b\u5206\u96e2<\/td><\/tr><tr><td>\u62e1\u5f35\u6027<\/td><td>\u65b0\u3057\u3044\u30eb\u30fc\u30eb\u306e\u8ffd\u52a0\u304c\u5bb9\u6613\u306a\u8a2d\u8a08<\/td><\/tr><tr><td>\u518d\u5229\u7528\u6027<\/td><td>\u6c4e\u7528\u7684\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd\u306e\u63d0\u4f9b<\/td><\/tr><tr><td>\u30b9\u30ec\u30c3\u30c9\u30bb\u30fc\u30d5\u30c6\u30a3<\/td><td>\u4e26\u884c\u5b9f\u884c\u306b\u5bfe\u5fdc\u3057\u305f\u5b9f\u88c5<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-87\">\n<h3 class=\"wp-block-heading\" id=\"i-33\">5.2 \u30ab\u30b9\u30bf\u30e0\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u5b9f\u88c5\u4f8b<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-88\">\n<p>\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u305f\u5ba3\u8a00\u7684\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">\/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\npublic class ValidationAnnotations {\n    @Retention(RetentionPolicy.RUNTIME)\n    @Target(ElementType.FIELD)\n    public @interface Pattern {\n        String regexp();\n        String message() default \"Invalid format\";\n    }\n\n    @Retention(RetentionPolicy.RUNTIME)\n    @Target(ElementType.FIELD)\n    public @interface NotNull {\n        String message() default \"Value cannot be null\";\n    }\n\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5bfe\u8c61\u306e\u30c7\u30fc\u30bf\u30af\u30e9\u30b9\n    public static class UserProfile {\n        @NotNull(message = \"Email is required\")\n        @Pattern(regexp = \"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$\",\n                message = \"Invalid email format\")\n        private String email;\n\n        @Pattern(regexp = \"^\\\\d{2,4}-\\\\d{2,4}-\\\\d{4}$\",\n                message = \"Invalid phone number format\")\n        private String phoneNumber;\n\n        \/\/ \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3001\u30b2\u30c3\u30bf\u30fc\u3001\u30bb\u30c3\u30bf\u30fc\n    }\n\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c\u30af\u30e9\u30b9\n    public static class AnnotationValidator {\n        public ValidationResult validate(Object object) {\n            List&lt;String&gt; errors = new ArrayList&lt;&gt;();\n\n            for (Field field : object.getClass().getDeclaredFields()) {\n                field.setAccessible(true);\n\n                try {\n                    \/\/ NotNull\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\n                    if (field.isAnnotationPresent(NotNull.class)) {\n                        Object value = field.get(object);\n                        if (value == null) {\n                            NotNull annotation = field.getAnnotation(NotNull.class);\n                            errors.add(annotation.message());\n                        }\n                    }\n\n                    \/\/ Pattern\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\n                    if (field.isAnnotationPresent(Pattern.class)) {\n                        Object value = field.get(object);\n                        if (value != null) {\n                            Pattern annotation = field.getAnnotation(Pattern.class);\n                            if (!java.util.regex.Pattern.compile(\n                                annotation.regexp())\n                                .matcher(value.toString()).matches()) {\n                                errors.add(annotation.message());\n                            }\n                        }\n                    }\n                } catch (IllegalAccessException e) {\n                    errors.add(\"Validation failed: \" + e.getMessage());\n                }\n            }\n\n            return new ValidationResult(errors.isEmpty(), errors);\n        }\n    }\n\n    \/\/ \u4f7f\u7528\u4f8b\n    public static void demonstrateAnnotationValidation() {\n        UserProfile profile = new UserProfile();\n        profile.setEmail(\"invalid-email\");\n        profile.setPhoneNumber(\"invalid-phone\");\n\n        AnnotationValidator validator = new AnnotationValidator();\n        ValidationResult result = validator.validate(profile);\n\n        if (!result.isValid()) {\n            result.getErrors().forEach(System.out::println);\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-89\">\n<h3 class=\"wp-block-heading\" id=\"i-34\">5.3 \u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\u66f8\u304d\u65b9<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-90\">\n<p>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5\u306e\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">@ExtendWith(MockitoExtension.class)\npublic class ValidationTests {\n    private UserDataValidator validator;\n\n    @BeforeEach\n    void setUp() {\n        validator = new UserDataValidator();\n    }\n\n    @Test\n    @DisplayName(\"\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u691c\u8a3c\")\n    void testValidEmail() {\n        \/\/ \u6e96\u5099\n        UserData userData = new UserData(\"test@example.com\", \"03-1234-5678\");\n\n        \/\/ \u5b9f\u884c\n        ValidationResult result = validator.validate(userData);\n\n        \/\/ \u691c\u8a3c\n        assertTrue(result.isValid(), \"Valid email should pass validation\");\n        assertTrue(result.getErrors().isEmpty(), \n            \"No errors should be present for valid email\");\n    }\n\n    @Test\n    @DisplayName(\"\u7121\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u691c\u8a3c\")\n    void testInvalidEmail() {\n        \/\/ \u6e96\u5099\n        UserData userData = new UserData(\"invalid-email\", \"03-1234-5678\");\n\n        \/\/ \u5b9f\u884c\n        ValidationResult result = validator.validate(userData);\n\n        \/\/ \u691c\u8a3c\n        assertFalse(result.isValid(), \n            \"Invalid email should fail validation\");\n        assertTrue(result.getErrors().stream()\n            .anyMatch(error -&gt; error.contains(\"Invalid email\")),\n            \"Should contain email error message\");\n    }\n\n    @Nested\n    @DisplayName(\"\u96fb\u8a71\u756a\u53f7\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30c6\u30b9\u30c8\")\n    class PhoneValidationTests {\n        @Test\n        @DisplayName(\"\u6709\u52b9\u306a\u96fb\u8a71\u756a\u53f7\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\")\n        void testValidPhoneFormats() {\n            \/\/ \u6709\u52b9\u306a\u96fb\u8a71\u756a\u53f7\u30d1\u30bf\u30fc\u30f3\u306e\u30c6\u30b9\u30c8\n            List&lt;String&gt; validPhones = Arrays.asList(\n                \"03-1234-5678\",\n                \"090-1234-5678\",\n                \"0123-12-3456\"\n            );\n\n            for (String phone : validPhones) {\n                UserData userData = new UserData(\n                    \"test@example.com\", phone);\n                ValidationResult result = validator.validate(userData);\n                assertTrue(result.isValid(), \n                    \"Phone number \" + phone + \" should be valid\");\n            }\n        }\n\n        @Test\n        @DisplayName(\"\u7121\u52b9\u306a\u96fb\u8a71\u756a\u53f7\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\")\n        void testInvalidPhoneFormats() {\n            \/\/ \u7121\u52b9\u306a\u96fb\u8a71\u756a\u53f7\u30d1\u30bf\u30fc\u30f3\u306e\u30c6\u30b9\u30c8\n            List&lt;String&gt; invalidPhones = Arrays.asList(\n                \"090-123-456\",\n                \"090-1234-567\",\n                \"090-12345-6789\"\n            );\n\n            for (String phone : invalidPhones) {\n                UserData userData = new UserData(\n                    \"test@example.com\", phone);\n                ValidationResult result = validator.validate(userData);\n                assertFalse(result.isValid(), \n                    \"Phone number \" + phone + \" should be invalid\");\n            }\n        }\n    }\n\n    @Test\n    @DisplayName(\"\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c6\u30b9\u30c8\")\n    void testValidationPerformance() {\n        \/\/ \u6e96\u5099\n        UserData userData = new UserData(\n            \"test@example.com\", \"03-1234-5678\");\n\n        \/\/ \u5b9f\u884c\n        long startTime = System.nanoTime();\n        for (int i = 0; i &lt; 1000; i++) {\n            validator.validate(userData);\n        }\n        long endTime = System.nanoTime();\n\n        \/\/ \u691c\u8a3c\n        long durationMs = (endTime - startTime) \/ 1_000_000;\n        assertTrue(durationMs &lt; 1000, \n            \"Validation should complete within 1 second\");\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-91\">\n<h4 class=\"wp-block-heading\" id=\"i-35\">\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u4f5c\u6210\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"id-2c490ca1-28a0-4fa0-a46d-6a3f2846c5d5\"><div id=\"sgb-css-id-92\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u9805\u76ee<\/th><th>\u8aac\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u8a2d\u8a08<\/td><td>\u6b63\u5e38\u7cfb\u3068\u7570\u5e38\u7cfb\u306e\u4e21\u65b9\u3092\u30ab\u30d0\u30fc<\/td><\/tr><tr><td>\u30c6\u30b9\u30c8\u306e\u72ec\u7acb\u6027<\/td><td>\u5404\u30c6\u30b9\u30c8\u306f\u72ec\u7acb\u3057\u3066\u5b9f\u884c\u53ef\u80fd<\/td><\/tr><tr><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c6\u30b9\u30c8<\/td><td>\u51e6\u7406\u6642\u9593\u306e\u5236\u7d04\u3092\u78ba\u8a8d<\/td><\/tr><tr><td>\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf<\/td><td>\u5883\u754c\u5024\u3084\u7279\u6b8a\u30b1\u30fc\u30b9\u3092\u8003\u616e<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-93\">\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u5b9f\u8df5\u7684\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5\u3067\u306f\u3001\u518d\u5229\u7528\u6027\u3001\u4fdd\u5b88\u6027\u3001\u30c6\u30b9\u30c8\u5bb9\u6613\u6027\u3092\u8003\u616e\u3057\u305f\u8a2d\u8a08\u304c\u91cd\u8981\u3067\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u5bfe\u51e6\u6cd5\u306b\u3064\u3044\u3066\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-94\">\n<h2 class=\"wp-block-heading\" id=\"i-36\">\uff16\uff0e\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u5bfe\u51e6\u6cd5<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-95\">\n<h3 class=\"wp-block-heading\" id=\"i-37\">6.1 \u30d1\u30bf\u30fc\u30f3\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306e\u30a8\u30e9\u30fc\u5bfe\u7b56<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-96\">\n<p>\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306b\u767a\u751f\u3059\u308b\u4e00\u822c\u7684\u306a\u30a8\u30e9\u30fc\u3068\u305d\u306e\u5bfe\u51e6\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class PatternCompilationTroubleshooting {\n    \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u542b\u3080\u30d1\u30bf\u30fc\u30f3\u30b3\u30f3\u30d1\u30a4\u30e9\n    public static class SafePatternCompiler {\n        public static Pattern compile(String regex) {\n            try {\n                return Pattern.compile(regex);\n            } catch (PatternSyntaxException e) {\n                throw new PatternCompilationException(\n                    \"Invalid regex pattern: \" + regex,\n                    e.getDescription(),\n                    e.getIndex()\n                );\n            }\n        }\n    }\n\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\n    public static class PatternCompilationException extends RuntimeException {\n        private final String description;\n        private final int errorIndex;\n\n        public PatternCompilationException(\n            String message, String description, int errorIndex) {\n            super(message);\n            this.description = description;\n            this.errorIndex = errorIndex;\n        }\n\n        public String getDetailedMessage() {\n            return String.format(\n                \"Error at index %d: %s%nDescription: %s\",\n                errorIndex, getMessage(), description);\n        }\n    }\n\n    \/\/ \u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u30d1\u30bf\u30fc\u30f3\u3068\u5bfe\u51e6\u4f8b\n    public static class CommonErrorPatterns {\n        public static void demonstrateCommonErrors() {\n            \/\/ 1. \u672a\u30a8\u30b9\u30b1\u30fc\u30d7\u306e\u7279\u6b8a\u6587\u5b57\n            try {\n                SafePatternCompiler.compile(\"hello.world[\");\n            } catch (PatternCompilationException e) {\n                System.out.println(\"Unclosed character class: \" + \n                    e.getDetailedMessage());\n            }\n\n            \/\/ 2. \u7121\u52b9\u306a\u91cf\u6307\u5b9a\u5b50\n            try {\n                SafePatternCompiler.compile(\"a{2,1}\");\n            } catch (PatternCompilationException e) {\n                System.out.println(\"Invalid quantifier: \" + \n                    e.getDetailedMessage());\n            }\n\n            \/\/ 3. \u672a\u9589\u3058\u306e\u62ec\u5f27\n            try {\n                SafePatternCompiler.compile(\"(abc\");\n            } catch (PatternCompilationException e) {\n                System.out.println(\"Unclosed group: \" + \n                    e.getDetailedMessage());\n            }\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-97\">\n<h4 class=\"wp-block-heading\" id=\"i-38\">\u3088\u304f\u3042\u308b\u30b3\u30f3\u30d1\u30a4\u30eb\u30a8\u30e9\u30fc\u3068\u5bfe\u51e6\u6cd5<\/h4>\n<\/div>\n\n<div id=\"id-898e6ef5-60c5-47fd-a7f5-142a8bfcdc0c\"><div id=\"sgb-css-id-98\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30a8\u30e9\u30fc\u30d1\u30bf\u30fc\u30f3<\/th><th>\u539f\u56e0<\/th><th>\u5bfe\u51e6\u65b9\u6cd5<\/th><\/tr><\/thead><tbody><tr><td>PatternSyntaxException<\/td><td>\u69cb\u6587\u30a8\u30e9\u30fc<\/td><td>\u30d1\u30bf\u30fc\u30f3\u306e\u69cb\u6587\u3092\u78ba\u8a8d\u3001\u7279\u6b8a\u6587\u5b57\u306e\u30a8\u30b9\u30b1\u30fc\u30d7<\/td><\/tr><tr><td>IllegalArgumentException<\/td><td>\u7121\u52b9\u306a\u5f15\u6570<\/td><td>\u5f15\u6570\u306e\u59a5\u5f53\u6027\u3092\u78ba\u8a8d<\/td><\/tr><tr><td>StackOverflowError<\/td><td>\u904e\u5ea6\u306a\u518d\u5e30<\/td><td>\u30d1\u30bf\u30fc\u30f3\u306e\u8907\u96d1\u3055\u3092\u8efd\u6e1b<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-99\">\n<h3 class=\"wp-block-heading\" id=\"i-39\">6.2 \u30de\u30c3\u30c1\u30f3\u30b0\u5b9f\u884c\u6642\u306e\u4f8b\u5916\u51e6\u7406<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-100\">\n<p>\u5b9f\u884c\u6642\u306b\u767a\u751f\u3059\u308b\u4f8b\u5916\u3068\u305d\u306e\u9069\u5207\u306a\u51e6\u7406\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class RuntimeExceptionHandling {\n    \/\/ \u5b89\u5168\u306a\u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u30f3\u30b0\u5b9f\u88c5\n    public static class SafeMatcher {\n        private static final int TIMEOUT_MS = 1000;\n\n        public static boolean safeMatch(\n            Pattern pattern, String input, int maxLength) {\n\n            \/\/ \u5165\u529b\u5024\u306e\u691c\u8a3c\n            if (input == null) {\n                throw new IllegalArgumentException(\"Input cannot be null\");\n            }\n\n            if (input.length() &gt; maxLength) {\n                throw new IllegalArgumentException(\n                    \"Input exceeds maximum length of \" + maxLength);\n            }\n\n            \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u4ed8\u304d\u30de\u30c3\u30c1\u30f3\u30b0\n            return executeWithTimeout(() -&gt; \n                pattern.matcher(input).matches(), TIMEOUT_MS);\n        }\n\n        \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u51e6\u7406\u306e\u5b9f\u88c5\n        private static boolean executeWithTimeout(\n            Supplier&lt;Boolean&gt; task, long timeoutMs) {\n\n            ExecutorService executor = \n                Executors.newSingleThreadExecutor();\n            Future&lt;Boolean&gt; future = executor.submit(task::get);\n\n            try {\n                return future.get(timeoutMs, TimeUnit.MILLISECONDS);\n            } catch (TimeoutException e) {\n                future.cancel(true);\n                throw new MatchingTimeoutException(\n                    \"Pattern matching timed out after \" + timeoutMs + \"ms\");\n            } catch (Exception e) {\n                throw new MatchingException(\"Matching failed\", e);\n            } finally {\n                executor.shutdownNow();\n            }\n        }\n    }\n\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\n    public static class MatchingTimeoutException extends RuntimeException {\n        public MatchingTimeoutException(String message) {\n            super(message);\n        }\n    }\n\n    public static class MatchingException extends RuntimeException {\n        public MatchingException(String message, Throwable cause) {\n            super(message, cause);\n        }\n    }\n\n    \/\/ \u5b9f\u884c\u6642\u30a8\u30e9\u30fc\u306e\u30c7\u30e2\n    public static void demonstrateRuntimeErrors() {\n        Pattern pattern = Pattern.compile(\"(a+)+b\");\n        String input = \"a\".repeat(100);\n\n        try {\n            SafeMatcher.safeMatch(pattern, input, 50);\n        } catch (IllegalArgumentException e) {\n            System.out.println(\"Input validation failed: \" + e.getMessage());\n        } catch (MatchingTimeoutException e) {\n            System.out.println(\"Matching timed out: \" + e.getMessage());\n        } catch (MatchingException e) {\n            System.out.println(\"Matching failed: \" + e.getMessage());\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-101\">\n<h3 class=\"wp-block-heading\" id=\"i-40\">6.3 \u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306e\u30ed\u30b0\u51fa\u529b\u65b9\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-102\">\n<p>\u52b9\u679c\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306e\u30ed\u30b0\u51fa\u529b\u5b9f\u88c5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class RegexDebugger {\n    private static final Logger logger = \n        LoggerFactory.getLogger(RegexDebugger.class);\n\n    \/\/ \u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u3092\u542b\u3080\u30de\u30c3\u30c1\u30e3\u30fc\n    public static class DebugMatcher {\n        private final Pattern pattern;\n        private final String input;\n        private final boolean debug;\n\n        public DebugMatcher(String regex, String input, boolean debug) {\n            this.pattern = Pattern.compile(regex);\n            this.input = input;\n            this.debug = debug;\n        }\n\n        public boolean matches() {\n            if (debug) {\n                return debugMatches();\n            }\n            return pattern.matcher(input).matches();\n        }\n\n        private boolean debugMatches() {\n            Matcher matcher = pattern.matcher(input);\n            boolean result = matcher.matches();\n\n            logger.debug(\"Pattern: {}\", pattern.pattern());\n            logger.debug(\"Input: {}\", input);\n            logger.debug(\"Match result: {}\", result);\n\n            if (result) {\n                \/\/ \u30b0\u30eb\u30fc\u30d7\u60c5\u5831\u306e\u30ed\u30b0\u51fa\u529b\n                for (int i = 0; i &lt;= matcher.groupCount(); i++) {\n                    logger.debug(\"Group {}: {}\", i, matcher.group(i));\n                }\n            }\n\n            return result;\n        }\n\n        public List&lt;MatchResult&gt; findAll() {\n            List&lt;MatchResult&gt; results = new ArrayList&lt;&gt;();\n            Matcher matcher = pattern.matcher(input);\n\n            while (matcher.find()) {\n                if (debug) {\n                    logger.debug(\"Found match at index {}-{}: {}\",\n                        matcher.start(), matcher.end(), \n                        matcher.group());\n                }\n                results.add(matcher.toMatchResult());\n            }\n\n            return results;\n        }\n    }\n\n    \/\/ \u30c7\u30d0\u30c3\u30b0\u7528\u306e\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u30e1\u30bd\u30c3\u30c9\n    public static class RegexAnalyzer {\n        public static void analyzePattern(String regex) {\n            logger.info(\"Analyzing regex pattern: {}\", regex);\n\n            \/\/ \u30d1\u30bf\u30fc\u30f3\u306e\u69cb\u6210\u8981\u7d20\u3092\u89e3\u6790\n            Map&lt;String, Integer&gt; components = new HashMap&lt;&gt;();\n            components.put(\"Groups\", countGroups(regex));\n            components.put(\"Quantifiers\", countQuantifiers(regex));\n            components.put(\"Character Classes\", countCharacterClasses(regex));\n\n            components.forEach((key, value) -&gt; \n                logger.info(\"{}: {}\", key, value));\n        }\n\n        private static int countGroups(String regex) {\n            return (int) regex.chars().filter(ch -&gt; ch == '(').count();\n        }\n\n        private static int countQuantifiers(String regex) {\n            Pattern quantifierPattern = \n                Pattern.compile(\"[*+?]|\\\\{\\\\d+,?\\\\d*\\\\}\");\n            Matcher matcher = quantifierPattern.matcher(regex);\n            int count = 0;\n            while (matcher.find()) count++;\n            return count;\n        }\n\n        private static int countCharacterClasses(String regex) {\n            return (int) regex.chars().filter(ch -&gt; ch == '[').count();\n        }\n    }\n\n    \/\/ \u4f7f\u7528\u4f8b\n    public static void demonstrateDebugging() {\n        String regex = \"(\\\\w+)@(\\\\w+\\\\.\\\\w+)\";\n        String input = \"test@example.com\";\n\n        \/\/ \u30d1\u30bf\u30fc\u30f3\u306e\u89e3\u6790\n        RegexAnalyzer.analyzePattern(regex);\n\n        \/\/ \u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3067\u30de\u30c3\u30c1\u30f3\u30b0\n        DebugMatcher debugMatcher = \n            new DebugMatcher(regex, input, true);\n        boolean matches = debugMatcher.matches();\n\n        logger.info(\"Final match result: {}\", matches);\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-103\">\n<h4 class=\"wp-block-heading\" id=\"i-41\">\u30c7\u30d0\u30c3\u30b0\u30ed\u30b0\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"id-a495234d-ea25-479a-97b5-99fe7c2efc8d\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30ed\u30b0\u9805\u76ee<\/th><th>\u76ee\u7684<\/th><th>\u542b\u3081\u308b\u3079\u304d\u60c5\u5831<\/th><\/tr><\/thead><tbody><tr><td>\u30d1\u30bf\u30fc\u30f3\u60c5\u5831<\/td><td>\u30d1\u30bf\u30fc\u30f3\u306e\u69cb\u9020\u78ba\u8a8d<\/td><td>\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u3001\u30d5\u30e9\u30b0<\/td><\/tr><tr><td>\u5165\u529b\u30c7\u30fc\u30bf<\/td><td>\u5165\u529b\u5024\u306e\u78ba\u8a8d<\/td><td>\u5b9f\u969b\u306e\u5165\u529b\u6587\u5b57\u5217\u3001\u9577\u3055<\/td><\/tr><tr><td>\u30de\u30c3\u30c1\u7d50\u679c<\/td><td>\u7d50\u679c\u306e\u8a73\u7d30\u78ba\u8a8d<\/td><td>\u30de\u30c3\u30c1\u4f4d\u7f6e\u3001\u30b0\u30eb\u30fc\u30d7\u5185\u5bb9<\/td><\/tr><tr><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/td><td>\u51e6\u7406\u6642\u9593\u306e\u8a08\u6e2c<\/td><td>\u5b9f\u884c\u6642\u9593\u3001\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n<div id=\"sgb-css-id-104\">\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u9069\u5207\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u3068\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u89e3\u6c7a\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u77e5\u8b58\u3092\u8e0f\u307e\u3048\u305f\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u3064\u3044\u3066\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-105\">\n<h2 class=\"wp-block-heading\" id=\"i-42\">\uff17\uff0e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f3<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-106\">\n<h3 class=\"wp-block-heading\" id=\"i-43\">7.1 \u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u547d\u540d\u898f\u5247<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-107\">\n<p>\u6b63\u898f\u8868\u73fe\u51e6\u7406\u306e\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u547d\u540d\u898f\u5247\u3068\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class RegexBestPractices {\n    \/\/ \u30d1\u30bf\u30fc\u30f3\u5b9a\u6570\u306e\u547d\u540d\u4f8b\n    public static class PatternConstants {\n        \/\/ \u547d\u540d\u898f\u5247\uff1a[\u30c7\u30fc\u30bf\u7a2e\u5225]_PATTERN\n        private static final Pattern EMAIL_PATTERN = Pattern.compile(\n            \"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$\"\n        );\n\n        \/\/ \u30d1\u30bf\u30fc\u30f3\u306e\u8aac\u660e\u3092Javadoc\u3067\u8a18\u8ff0\n        \/**\n         * \u96fb\u8a71\u756a\u53f7\u3092\u691c\u8a3c\u3059\u308b\u30d1\u30bf\u30fc\u30f3.\n         * \u5f62\u5f0f: XX-XXXX-XXXX\uff08\u5e02\u5916\u5c40\u756a-\u5e02\u5185\u5c40\u756a-\u52a0\u5165\u8005\u756a\u53f7\uff09\n         * \u8a31\u5bb9\u7bc4\u56f2:\n         * - \u5e02\u5916\u5c40\u756a: 2-4\u6841\n         * - \u5e02\u5185\u5c40\u756a: 2-4\u6841\n         * - \u52a0\u5165\u8005\u756a\u53f7: 4\u6841\n         *\/\n        private static final Pattern PHONE_NUMBER_PATTERN = Pattern.compile(\n            \"^\\\\d{2,4}-\\\\d{2,4}-\\\\d{4}$\"\n        );\n\n        \/\/ \u30d1\u30bf\u30fc\u30f3\u306e\u69cb\u6210\u8981\u7d20\u3092\u5206\u5272\u3057\u3066\u53ef\u8aad\u6027\u3092\u5411\u4e0a\n        private static final class PostalCodePatternComponents {\n            static final String PREFIX = \"^\";\n            static final String THREE_DIGITS = \"\\\\d{3}\";\n            static final String HYPHEN = \"-\";\n            static final String FOUR_DIGITS = \"\\\\d{4}\";\n            static final String SUFFIX = \"$\";\n\n            static final Pattern POSTAL_CODE_PATTERN = Pattern.compile(\n                PREFIX + THREE_DIGITS + HYPHEN + FOUR_DIGITS + SUFFIX\n            );\n        }\n    }\n\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30e1\u30bd\u30c3\u30c9\u306e\u547d\u540d\u4f8b\n    public static class ValidationMethods {\n        \/\/ \u52d5\u8a5e + \u5bfe\u8c61 + \u691c\u8a3c\u5185\u5bb9\n        public boolean isValidEmail(String email) {\n            return PatternConstants.EMAIL_PATTERN.matcher(email).matches();\n        }\n\n        \/\/ \u691c\u8a3c\u7d50\u679c\u3092\u8a73\u7d30\u306b\u8fd4\u3059\u5834\u5408\n        public ValidationResult validatePhoneNumber(String phoneNumber) {\n            if (phoneNumber == null) {\n                return ValidationResult.error(\"Phone number cannot be null\");\n            }\n\n            boolean matches = PatternConstants.PHONE_NUMBER_PATTERN\n                .matcher(phoneNumber).matches();\n            return matches ? \n                ValidationResult.success() : \n                ValidationResult.error(\"Invalid phone number format\");\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-108\">\n<h4 class=\"wp-block-heading\" id=\"i-44\">\u547d\u540d\u898f\u5247\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n<\/div>\n\n<div id=\"id-f9f58d8f-cf2b-451a-b041-6799f123069b\"><div id=\"sgb-css-id-109\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u8981\u7d20<\/th><th>\u898f\u5247<\/th><th>\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>\u30d1\u30bf\u30fc\u30f3\u5b9a\u6570<\/td><td>\u5927\u6587\u5b57\u30b9\u30cd\u30fc\u30af\u30b1\u30fc\u30b9 + _PATTERN<\/td><td>EMAIL_PATTERN<\/td><\/tr><tr><td>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30e1\u30bd\u30c3\u30c9<\/td><td>isValidXxx \u307e\u305f\u306f validateXxx<\/td><td>isValidEmail<\/td><\/tr><tr><td>\u30ab\u30b9\u30bf\u30e0Exception<\/td><td>\u5177\u4f53\u7684\u306a\u4f8b\u5916\u540d + Exception<\/td><td>InvalidPatternException<\/td><\/tr><tr><td>\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u30af\u30e9\u30b9<\/td><td>\u6a5f\u80fd\u540d + Util\/Helper<\/td><td>RegexHelper<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-110\">\n<h3 class=\"wp-block-heading\" id=\"i-45\">7.2 \u907f\u3051\u308b\u3079\u304d\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-111\">\n<p>\u4e00\u822c\u7684\u306a\u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f3\u3068\u305d\u306e\u6539\u5584\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class RegexAntiPatterns {\n    \/\/ \u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f31: \u30d1\u30bf\u30fc\u30f3\u306e\u90fd\u5ea6\u30b3\u30f3\u30d1\u30a4\u30eb\n    public class BadImplementation {\n        \/\/ \u60aa\u3044\u4f8b\n        public boolean validateEmail(String email) {\n            return Pattern.compile(\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$\")\n                .matcher(email)\n                .matches();\n        }\n\n        \/\/ \u60aa\u3044\u4f8b: \u8907\u96d1\u3059\u304e\u308b\u30d1\u30bf\u30fc\u30f3\n        public static final Pattern COMPLEX_EMAIL = Pattern.compile(\n            \"^(?:[a-z0-9!#$%&amp;'*+\/=?^_`{|}~-]+(?:\\\\.[a-z0-9!#$%&amp;'*+\/=?^_`{|}~-]+)*\"\n            + \"|\\\"(?:[\\\\x01-\\\\x08\\\\x0b\\\\x0c\\\\x0e-\\\\x1f\\\\x21\\\\x23-\\\\x5b\\\\x5d-\\\\x7f]\"\n            + \"|\\\\\\\\[\\\\x01-\\\\x09\\\\x0b\\\\x0c\\\\x0e-\\\\x7f])*\\\")@(?:(?:[a-z0-9](?:[a-z0-9-]*\"\n            + \"[a-z0-9])?\\\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\\\[(?:(?:(2(5[0-5]|[0-4][0-9])\"\n            + \"|1[0-9][0-9]|[1-9]?[0-9]))\\\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]\"\n            + \"|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\\\x01-\\\\x08\\\\x0b\\\\x0c\\\\x0e-\\\\x1f\"\n            + \"\\\\x21-\\\\x5a\\\\x53-\\\\x7f]|\\\\\\\\[\\\\x01-\\\\x09\\\\x0b\\\\x0c\\\\x0e-\\\\x7f])+)\\\\])$\"\n        );\n    }\n\n    \/\/ \u6539\u5584\u4f8b\n    public class GoodImplementation {\n        \/\/ \u826f\u3044\u4f8b: \u30d1\u30bf\u30fc\u30f3\u3092\u518d\u5229\u7528\n        private static final Pattern EMAIL_PATTERN = Pattern.compile(\n            \"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$\"\n        );\n\n        \/\/ \u826f\u3044\u4f8b: \u9069\u5ea6\u306a\u59a5\u5354\u3068\u8aac\u660e\u4ed8\u304d\u306e\u30d1\u30bf\u30fc\u30f3\n        \/**\n         * \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u57fa\u672c\u7684\u306a\u5f62\u5f0f\u3092\u691c\u8a3c\u3059\u308b\u30d1\u30bf\u30fc\u30f3.\n         * RFC 5322\u306e\u5b8c\u5168\u306a\u5b9f\u88c5\u3067\u306f\u306a\u304f\u3001\u4e00\u822c\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\n         * \u7279\u5316\u3057\u305f\u5b9f\u7528\u7684\u306a\u5b9f\u88c5.\n         *\/\n        public boolean validateEmail(String email) {\n            return email != null &amp;&amp; EMAIL_PATTERN.matcher(email).matches();\n        }\n    }\n\n    \/\/ \u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f32: \u30a8\u30e9\u30fc\u51e6\u7406\u306e\u6b20\u5982\n    public class ErrorHandlingAntiPattern {\n        \/\/ \u60aa\u3044\u4f8b: \u30a8\u30e9\u30fc\u51e6\u7406\u306a\u3057\n        public boolean badValidation(String input, String pattern) {\n            return Pattern.compile(pattern).matcher(input).matches();\n        }\n\n        \/\/ \u826f\u3044\u4f8b: \u9069\u5207\u306a\u30a8\u30e9\u30fc\u51e6\u7406\n        public ValidationResult goodValidation(String input, String pattern) {\n            try {\n                if (input == null || pattern == null) {\n                    return ValidationResult.error(\"Input and pattern cannot be null\");\n                }\n\n                Pattern compiledPattern = Pattern.compile(pattern);\n                boolean matches = compiledPattern.matcher(input).matches();\n\n                return matches ?\n                    ValidationResult.success() :\n                    ValidationResult.error(\"Pattern matching failed\");\n\n            } catch (PatternSyntaxException e) {\n                return ValidationResult.error(\"Invalid pattern syntax: \" + e.getMessage());\n            } catch (Exception e) {\n                return ValidationResult.error(\"Validation failed: \" + e.getMessage());\n            }\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-112\">\n<h4 class=\"wp-block-heading\" id=\"i-46\">\u4e3b\u306a\u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f3<\/h4>\n<\/div>\n\n<div id=\"id-48b84c94-f8b7-4da2-a406-ab64afba70e3\"><div id=\"sgb-css-id-113\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f3<\/th><th>\u554f\u984c\u70b9<\/th><th>\u6539\u5584\u65b9\u6cd5<\/th><\/tr><\/thead><tbody><tr><td>\u30d1\u30bf\u30fc\u30f3\u306e\u90fd\u5ea6\u30b3\u30f3\u30d1\u30a4\u30eb<\/td><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u4f4e\u4e0b<\/td><td>\u5b9a\u6570\u3068\u3057\u3066\u4e8b\u524d\u30b3\u30f3\u30d1\u30a4\u30eb<\/td><\/tr><tr><td>\u904e\u5ea6\u306b\u8907\u96d1\u306a\u30d1\u30bf\u30fc\u30f3<\/td><td>\u4fdd\u5b88\u6027\u4f4e\u4e0b\u3001\u30d0\u30b0\u6df7\u5165<\/td><td>\u9069\u5ea6\u306a\u59a5\u5354\u3068\u5206\u5272<\/td><\/tr><tr><td>\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u6b20\u5982<\/td><td>\u4fe1\u983c\u6027\u4f4e\u4e0b<\/td><td>\u9069\u5207\u306a\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5<\/td><\/tr><tr><td>\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u4e0d\u8db3<\/td><td>\u4fdd\u5b88\u6027\u4f4e\u4e0b<\/td><td>Javadoc\u306b\u3088\u308b\u8aac\u660e\u8ffd\u52a0<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-114\">\n<h3 class=\"wp-block-heading\" id=\"i-47\">7.3 \u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u3067\u306e\u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-115\">\n<p>\u6b63\u898f\u8868\u73fe\u5b9f\u88c5\u306e\u30ec\u30d3\u30e5\u30fc\u6642\u306b\u78ba\u8a8d\u3059\u3079\u304d\u30dd\u30a4\u30f3\u30c8\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n<\/div>\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=\"\">public class RegexCodeReview {\n    \/**\n     * \u6b63\u898f\u8868\u73fe\u5b9f\u88c5\u306e\u30ec\u30d3\u30e5\u30fc\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\n     *\/\n    public static class ReviewChecklist {\n        \/\/ 1. \u30d1\u30bf\u30fc\u30f3\u306e\u59a5\u5f53\u6027\u30c1\u30a7\u30c3\u30af\n        public static boolean validatePattern(Pattern pattern) {\n            \/\/ \u30d1\u30bf\u30fc\u30f3\u306e\u57fa\u672c\u30c1\u30a7\u30c3\u30af\n            if (pattern == null) {\n                return false;\n            }\n\n            \/\/ \u30d1\u30bf\u30fc\u30f3\u306e\u8907\u96d1\u3055\u30c1\u30a7\u30c3\u30af\n            String regex = pattern.pattern();\n            int complexity = calculatePatternComplexity(regex);\n\n            return complexity &lt;= 10; \/\/ \u8907\u96d1\u3055\u306e\u95be\u5024\n        }\n\n        \/\/ \u30d1\u30bf\u30fc\u30f3\u306e\u8907\u96d1\u3055\u3092\u8a08\u7b97\n        private static int calculatePatternComplexity(String regex) {\n            int complexity = 0;\n            complexity += regex.length() \/ 10;  \/\/ \u9577\u3055\u306b\u3088\u308b\u8907\u96d1\u3055\n            complexity += countGroups(regex);   \/\/ \u30b0\u30eb\u30fc\u30d7\u306e\u6570\n            complexity += countQuantifiers(regex); \/\/ \u91cf\u6307\u5b9a\u5b50\u306e\u6570\n            return complexity;\n        }\n\n        \/\/ 2. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30a7\u30c3\u30af\n        public static PerformanceResult checkPerformance(\n            Pattern pattern, String testInput) {\n\n            long startTime = System.nanoTime();\n            pattern.matcher(testInput).matches();\n            long endTime = System.nanoTime();\n\n            long duration = (endTime - startTime) \/ 1_000_000; \/\/ \u30df\u30ea\u79d2\n\n            return new PerformanceResult(\n                duration &lt; 100,  \/\/ 100ms\u4ee5\u5185\u3092\u8a31\u5bb9\n                duration\n            );\n        }\n\n        \/\/ 3. \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c1\u30a7\u30c3\u30af\n        public static SecurityResult checkSecurity(Pattern pattern) {\n            String regex = pattern.pattern();\n            List&lt;String&gt; warnings = new ArrayList&lt;&gt;();\n\n            \/\/ \u5371\u967a\u306a\u69cb\u6587\u306e\u30c1\u30a7\u30c3\u30af\n            if (regex.contains(\"(.*)*\")) {\n                warnings.add(\"Potentially vulnerable to ReDoS attacks\");\n            }\n\n            if (regex.length() &gt; 1000) {\n                warnings.add(\"Pattern is too long and may cause performance issues\");\n            }\n\n            return new SecurityResult(warnings.isEmpty(), warnings);\n        }\n    }\n\n    \/\/ \u30ec\u30d3\u30e5\u30fc\u7d50\u679c\u3092\u8a18\u9332\u3059\u308b\u30af\u30e9\u30b9\n    public static class CodeReviewReport {\n        private final List&lt;String&gt; findings = new ArrayList&lt;&gt;();\n\n        public void addFinding(String category, String description) {\n            findings.add(String.format(\"[%s] %s\", category, description));\n        }\n\n        public void printReport() {\n            System.out.println(\"=== Code Review Report ===\");\n            findings.forEach(System.out::println);\n        }\n\n        \/\/ \u30ec\u30d3\u30e5\u30fc\u5b9f\u65bd\u4f8b\n        public static CodeReviewReport reviewImplementation(\n            Pattern pattern, String testInput) {\n\n            CodeReviewReport report = new CodeReviewReport();\n\n            \/\/ 1. \u30d1\u30bf\u30fc\u30f3\u306e\u59a5\u5f53\u6027\u30c1\u30a7\u30c3\u30af\n            if (!ReviewChecklist.validatePattern(pattern)) {\n                report.addFinding(\"Pattern\", \n                    \"Pattern is too complex or invalid\");\n            }\n\n            \/\/ 2. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30a7\u30c3\u30af\n            PerformanceResult perfResult = \n                ReviewChecklist.checkPerformance(pattern, testInput);\n            if (!perfResult.isAcceptable()) {\n                report.addFinding(\"Performance\", \n                    \"Pattern matching takes too long: \" + \n                    perfResult.getDuration() + \"ms\");\n            }\n\n            \/\/ 3. \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c1\u30a7\u30c3\u30af\n            SecurityResult secResult = \n                ReviewChecklist.checkSecurity(pattern);\n            if (!secResult.isSecure()) {\n                secResult.getWarnings().forEach(warning -&gt;\n                    report.addFinding(\"Security\", warning));\n            }\n\n            return report;\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-116\">\n<h4 class=\"wp-block-heading\" id=\"i-48\">\u30ec\u30d3\u30e5\u30fc\u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"id-546d1904-1cb2-4d9c-b7c0-f4db3cdff36f\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30ab\u30c6\u30b4\u30ea<\/th><th>\u30c1\u30a7\u30c3\u30af\u9805\u76ee<\/th><th>\u5224\u65ad\u57fa\u6e96<\/th><\/tr><\/thead><tbody><tr><td>\u30d1\u30bf\u30fc\u30f3\u8a2d\u8a08<\/td><td>\u8907\u96d1\u3055<\/td><td>\u30b0\u30eb\u30fc\u30d7\u6570\u3001\u91cf\u6307\u5b9a\u5b50\u6570<\/td><\/tr><tr><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/td><td>\u5b9f\u884c\u6642\u9593<\/td><td>100ms\u4ee5\u5185\u3092\u76ee\u5b89<\/td><\/tr><tr><td>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/td><td>\u8106\u5f31\u6027<\/td><td>ReDoS\u5bfe\u7b56\u3001\u5165\u529b\u691c\u8a3c<\/td><\/tr><tr><td>\u4fdd\u5b88\u6027<\/td><td>\u30b3\u30fc\u30c9\u54c1\u8cea<\/td><td>\u547d\u540d\u898f\u5247\u3001\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n<div id=\"sgb-css-id-117\">\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u9069\u5207\u306a\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u5f93\u3044\u3001\u30a2\u30f3\u30c1\u30d1\u30bf\u30fc\u30f3\u3092\u907f\u3051\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u304c\u9ad8\u304f\u3001\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u6b63\u898f\u8868\u73fe\u5b9f\u88c5\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-118\">\n<h2 class=\"wp-block-heading\" id=\"i-49\">\u307e\u3068\u3081<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-119\">\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001Java\u306b\u304a\u3051\u308b\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001\u57fa\u790e\u304b\u3089\u5b9f\u8df5\u7684\u306a\u5185\u5bb9\u307e\u3067\u5e45\u5e83\u304f\u89e3\u8aac\u3057\u307e\u3057\u305f\u3002\u4ee5\u4e0b\u306b\u3001\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\u3092\u307e\u3068\u3081\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-120\">\n<p><strong>1. \u5b9f\u88c5\u65b9\u6cd5\u306e\u9078\u629e<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-121\">\n<p>\u3000\u25cf \u5358\u7d14\u306a\u691c\u8a3c\u306b\u306f<code>String.matches()<\/code><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-122\">\n<p>\u3000\u25cf \u518d\u5229\u7528\u6027\u304c\u91cd\u8981\u306a\u5834\u5408\u306f<code>Pattern.compile()<\/code><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-123\">\n<p>\u3000\u25cf \u9ad8\u5ea6\u306a\u51e6\u7406\u306b\u306f<code>Matcher<\/code>\u30af\u30e9\u30b9<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-124\">\n<p><strong>2. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-125\">\n<p>\u3000\u25cf \u30d1\u30bf\u30fc\u30f3\u306e\u4e8b\u524d\u30b3\u30f3\u30d1\u30a4\u30eb\u3068\u30ad\u30e3\u30c3\u30b7\u30e5<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-126\">\n<p>\u3000\u25cf \u9069\u5207\u306a\u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u306e\u8a2d\u8a08<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-127\">\n<p>\u3000\u25cf \u5165\u529b\u30c7\u30fc\u30bf\u306e\u4e8b\u524d\u691c\u8a3c<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-128\">\n<p><strong>3. \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-129\">\n<p>\u3000\u25cf ReDoS\u653b\u6483\u3078\u306e\u5bfe\u7b56<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-130\">\n<p>\u3000\u25cf \u5165\u529b\u30c7\u30fc\u30bf\u306e\u9577\u3055\u5236\u9650<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-131\">\n<p>\u3000\u25cf \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u51e6\u7406\u306e\u5b9f\u88c5<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-132\">\n<p><strong>4. \u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-133\">\n<p>\u3000\u25cf \u4fdd\u5b88\u6027\u3092\u8003\u616e\u3057\u305f\u547d\u540d\u898f\u5247\u306e\u63a1\u7528<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-134\">\n<p>\u3000\u25cf \u9069\u5207\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5b9f\u88c5<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-135\">\n<p>\u3000\u25cf \u5341\u5206\u306a\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u306e\u7528\u610f<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-136\">\n<p>\u3000\u25cf \u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u306e\u5b9f\u65bd<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-137\">\n<p><strong>5. \u4eca\u5f8c\u306e\u5b66\u7fd2\u306b\u5411\u3051\u3066<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-138\">\n<p>\u3000\u25cf \u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u306e\u8a73\u7d30\u306a\u5b66\u7fd2<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-139\">\n<p>\u3000\u25cf \u3088\u308a\u9ad8\u5ea6\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u8981\u4ef6\u3078\u306e\u5bfe\u5fdc<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-140\">\n<p>\u3000\u25cf \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u306e\u5b9f\u8df5<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-141\">\n<h4 class=\"wp-block-heading\" id=\"i-50\">\u6700\u5f8c\u306b<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-142\">\n<p>\u6b63\u898f\u8868\u73fe\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5\u306f\u3001\u5358\u7d14\u306a\u3088\u3046\u306b\u898b\u3048\u3066\u5965\u304c\u6df1\u3044\u6280\u8853\u5206\u91ce\u3067\u3059\u3002\u3053\u306e\u8a18\u4e8b\u3067\u89e3\u8aac\u3057\u305f\u5185\u5bb9\u3092\u57fa\u790e\u3068\u3057\u3066\u3001\u4ee5\u4e0b\u306e\u70b9\u3092\u610f\u8b58\u3057\u306a\u304c\u3089\u5b9f\u88c5\u3092\u9032\u3081\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-143\">\n<p>\u3000\u2705 \u5fc5\u8981\u5341\u5206\u306a\u8907\u96d1\u3055\u306e\u30d1\u30bf\u30fc\u30f3\u8a2d\u8a08<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-144\">\n<p>\u3000\u2705 \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u30d0\u30e9\u30f3\u30b9<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-145\">\n<p>\u3000\u2705 \u4fdd\u5b88\u6027\u3092\u8003\u616e\u3057\u305f\u30b3\u30fc\u30c9\u8a2d\u8a08<\/p>\n<\/div>\n\n\n<p>\u3000\u2705 \u9069\u5207\u306a\u30c6\u30b9\u30c8\u3068\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5b9f\u88c5<\/p>\n\n\n<div id=\"sgb-css-id-146\">\n<p>\u672c\u8a18\u4e8b\u3067\u7d39\u4ecb\u3057\u305f\u5b9f\u88c5\u65b9\u6cd5\u3084\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u53c2\u8003\u306b\u3001\u8981\u4ef6\u306b\u5fdc\u3058\u305f\u9069\u5207\u306a\u5b9f\u88c5\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001\u5b9f\u969b\u306e\u958b\u767a\u3067\u306f\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3084\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u89b3\u70b9\u3082\u5fd8\u308c\u305a\u306b\u8003\u616e\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002\u3053\u306e\u8a18\u4e8b\u3067\u5b66\u3093\u3060\u77e5\u8b58\u3092\u57fa\u306b\u3001\u3088\u308a\u826f\u3044\u5b9f\u88c5\u3092\u76ee\u6307\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<\/div>\n\n\n<p><\/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":2932,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,68,70],"tags":[],"class_list":{"0":"post-705","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-java","8":"category-java-best-practice","9":"category-java-string"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/705","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=705"}],"version-history":[{"count":10,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/705\/revisions"}],"predecessor-version":[{"id":2965,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/705\/revisions\/2965"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/media\/2932"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=705"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=705"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}