[{"data":1,"prerenderedAt":2765},["ShallowReactive",2],{"guide-regex-common-pitfalls":3},{"id":4,"title":5,"body":6,"date":2757,"description":2758,"extension":2759,"meta":2760,"navigation":484,"path":2761,"readingTime":553,"seo":2762,"stem":2763,"__hash__":2764},"guides\u002Fguides\u002Fregex-common-pitfalls.md","10 Common Regex Mistakes and How to Avoid Them",{"type":7,"value":8,"toc":2709},"minimark",[9,14,18,21,34,38,43,46,165,169,176,253,260,309,313,316,354,416,419,426,603,607,610,613,689,692,695,832,836,839,842,906,909,912,1004,1011,1014,1020,1097,1100,1111,1222,1226,1229,1232,1300,1303,1309,1377,1381,1384,1387,1512,1515,1522,1614,1618,1621,1630,1700,1703,1712,1804,1808,1811,1814,1874,1877,1884,1982,1986,1989,1992,2081,2084,2087,2199,2203,2359,2363,2366,2393,2627,2631,2634,2671,2678,2682,2705],[10,11,13],"h2",{"id":12},"introduction","Introduction",[15,16,17],"p",{},"Regular expressions are powerful but notoriously easy to get wrong. Even experienced developers make mistakes that lead to incorrect matches, security vulnerabilities, or performance issues. This guide covers the 10 most common regex mistakes and how to fix them.",[15,19,20],{},"Each mistake includes:",[22,23,24,28,31],"ul",{},[25,26,27],"li",{},"❌ The problematic pattern",[25,29,30],{},"✅ The correct approach",[25,32,33],{},"💡 Why it matters",[10,35,37],{"id":36},"mistake-1-greedy-matching-when-you-need-lazy","Mistake 1: Greedy Matching When You Need Lazy",[39,40,42],"h3",{"id":41},"the-problem","The Problem",[15,44,45],{},"By default, quantifiers are greedy — they match as much as possible. This often leads to matching more than intended.",[47,48,53],"pre",{"className":49,"code":50,"language":51,"meta":52,"style":52},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F ❌ BAD: Greedy quantifier matches too much\nconst html = '\u003Cdiv>Hello\u003C\u002Fdiv>\u003Cdiv>World\u003C\u002Fdiv>';\nconst match = html.match(\u002F\u003Cdiv>.*\u003C\\\u002Fdiv>\u002F);\nconsole.log(match[0]);\n\u002F\u002F Result: '\u003Cdiv>Hello\u003C\u002Fdiv>\u003Cdiv>World\u003C\u002Fdiv>'\n\u002F\u002F Matched from first \u003Cdiv> to LAST \u003C\u002Fdiv>!\n","javascript","",[54,55,56,65,87,135,153,159],"code",{"__ignoreMap":52},[57,58,61],"span",{"class":59,"line":60},"line",1,[57,62,64],{"class":63},"sJ8bj","\u002F\u002F ❌ BAD: Greedy quantifier matches too much\n",[57,66,68,72,76,79,83],{"class":59,"line":67},2,[57,69,71],{"class":70},"szBVR","const",[57,73,75],{"class":74},"sj4cs"," html",[57,77,78],{"class":70}," =",[57,80,82],{"class":81},"sZZnC"," '\u003Cdiv>Hello\u003C\u002Fdiv>\u003Cdiv>World\u003C\u002Fdiv>'",[57,84,86],{"class":85},"sVt8B",";\n",[57,88,90,92,95,97,100,104,107,110,114,117,120,123,127,130,132],{"class":59,"line":89},3,[57,91,71],{"class":70},[57,93,94],{"class":74}," match",[57,96,78],{"class":70},[57,98,99],{"class":85}," html.",[57,101,103],{"class":102},"sScJk","match",[57,105,106],{"class":85},"(",[57,108,109],{"class":81},"\u002F",[57,111,113],{"class":112},"sA_wV","\u003Cdiv>",[57,115,116],{"class":74},".",[57,118,119],{"class":70},"*",[57,121,122],{"class":112},"\u003C",[57,124,126],{"class":125},"snhLl","\\\u002F",[57,128,129],{"class":112},"div>",[57,131,109],{"class":81},[57,133,134],{"class":85},");\n",[57,136,138,141,144,147,150],{"class":59,"line":137},4,[57,139,140],{"class":85},"console.",[57,142,143],{"class":102},"log",[57,145,146],{"class":85},"(match[",[57,148,149],{"class":74},"0",[57,151,152],{"class":85},"]);\n",[57,154,156],{"class":59,"line":155},5,[57,157,158],{"class":63},"\u002F\u002F Result: '\u003Cdiv>Hello\u003C\u002Fdiv>\u003Cdiv>World\u003C\u002Fdiv>'\n",[57,160,162],{"class":59,"line":161},6,[57,163,164],{"class":63},"\u002F\u002F Matched from first \u003Cdiv> to LAST \u003C\u002Fdiv>!\n",[39,166,168],{"id":167},"the-fix","The Fix",[15,170,171,172,175],{},"Use lazy (non-greedy) quantifiers by adding ",[54,173,174],{},"?"," after the quantifier.",[47,177,179],{"className":49,"code":178,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ GOOD: Lazy quantifier matches minimally\nconst html = '\u003Cdiv>Hello\u003C\u002Fdiv>\u003Cdiv>World\u003C\u002Fdiv>';\nconst match = html.match(\u002F\u003Cdiv>.*?\u003C\\\u002Fdiv>\u002F);\nconsole.log(match[0]);\n\u002F\u002F Result: '\u003Cdiv>Hello\u003C\u002Fdiv>'\n\u002F\u002F Matches from first \u003Cdiv> to FIRST \u003C\u002Fdiv>\n",[54,180,181,186,198,231,243,248],{"__ignoreMap":52},[57,182,183],{"class":59,"line":60},[57,184,185],{"class":63},"\u002F\u002F ✅ GOOD: Lazy quantifier matches minimally\n",[57,187,188,190,192,194,196],{"class":59,"line":67},[57,189,71],{"class":70},[57,191,75],{"class":74},[57,193,78],{"class":70},[57,195,82],{"class":81},[57,197,86],{"class":85},[57,199,200,202,204,206,208,210,212,214,216,218,221,223,225,227,229],{"class":59,"line":89},[57,201,71],{"class":70},[57,203,94],{"class":74},[57,205,78],{"class":70},[57,207,99],{"class":85},[57,209,103],{"class":102},[57,211,106],{"class":85},[57,213,109],{"class":81},[57,215,113],{"class":112},[57,217,116],{"class":74},[57,219,220],{"class":70},"*?",[57,222,122],{"class":112},[57,224,126],{"class":125},[57,226,129],{"class":112},[57,228,109],{"class":81},[57,230,134],{"class":85},[57,232,233,235,237,239,241],{"class":59,"line":137},[57,234,140],{"class":85},[57,236,143],{"class":102},[57,238,146],{"class":85},[57,240,149],{"class":74},[57,242,152],{"class":85},[57,244,245],{"class":59,"line":155},[57,246,247],{"class":63},"\u002F\u002F Result: '\u003Cdiv>Hello\u003C\u002Fdiv>'\n",[57,249,250],{"class":59,"line":161},[57,251,252],{"class":63},"\u002F\u002F Matches from first \u003Cdiv> to FIRST \u003C\u002Fdiv>\n",[15,254,255,259],{},[256,257,258],"strong",{},"Better yet:"," Be more specific with character classes.",[47,261,263],{"className":49,"code":262,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ BEST: Specific character class (also faster)\nconst match = html.match(\u002F\u003Cdiv>[^\u003C]*\u003C\\\u002Fdiv>\u002F);\n",[54,264,265,270],{"__ignoreMap":52},[57,266,267],{"class":59,"line":60},[57,268,269],{"class":63},"\u002F\u002F ✅ BEST: Specific character class (also faster)\n",[57,271,272,274,276,278,280,282,284,286,288,291,294,297,299,301,303,305,307],{"class":59,"line":67},[57,273,71],{"class":70},[57,275,94],{"class":74},[57,277,78],{"class":70},[57,279,99],{"class":85},[57,281,103],{"class":102},[57,283,106],{"class":85},[57,285,109],{"class":81},[57,287,113],{"class":112},[57,289,290],{"class":74},"[",[57,292,293],{"class":70},"^",[57,295,296],{"class":74},"\u003C]",[57,298,119],{"class":70},[57,300,122],{"class":112},[57,302,126],{"class":125},[57,304,129],{"class":112},[57,306,109],{"class":81},[57,308,134],{"class":85},[10,310,312],{"id":311},"mistake-2-forgetting-to-escape-metacharacters","Mistake 2: Forgetting to Escape Metacharacters",[39,314,42],{"id":315},"the-problem-1",[15,317,318,319,321,322,321,324,321,327,321,329,321,331,321,334,321,336,321,339,321,342,321,345,321,348,321,350,353],{},"Characters like ",[54,320,116],{},", ",[54,323,119],{},[54,325,326],{},"+",[54,328,174],{},[54,330,106],{},[54,332,333],{},")",[54,335,290],{},[54,337,338],{},"]",[54,340,341],{},"{",[54,343,344],{},"}",[54,346,347],{},"|",[54,349,293],{},[54,351,352],{},"$"," have special meaning in regex.",[47,355,357],{"className":49,"code":356,"language":51,"meta":52,"style":52},"\u002F\u002F ❌ BAD: Trying to match a file extension\nconst filename = 'document.pdf';\nconst match = filename.match(\u002F.pdf$\u002F);\n\u002F\u002F Result: matches 'apdf', '1pdf', '?pdf', etc.\n\u002F\u002F Because . matches ANY character!\n",[54,358,359,364,378,406,411],{"__ignoreMap":52},[57,360,361],{"class":59,"line":60},[57,362,363],{"class":63},"\u002F\u002F ❌ BAD: Trying to match a file extension\n",[57,365,366,368,371,373,376],{"class":59,"line":67},[57,367,71],{"class":70},[57,369,370],{"class":74}," filename",[57,372,78],{"class":70},[57,374,375],{"class":81}," 'document.pdf'",[57,377,86],{"class":85},[57,379,380,382,384,386,389,391,393,395,397,400,402,404],{"class":59,"line":89},[57,381,71],{"class":70},[57,383,94],{"class":74},[57,385,78],{"class":70},[57,387,388],{"class":85}," filename.",[57,390,103],{"class":102},[57,392,106],{"class":85},[57,394,109],{"class":81},[57,396,116],{"class":74},[57,398,399],{"class":112},"pdf",[57,401,352],{"class":70},[57,403,109],{"class":81},[57,405,134],{"class":85},[57,407,408],{"class":59,"line":137},[57,409,410],{"class":63},"\u002F\u002F Result: matches 'apdf', '1pdf', '?pdf', etc.\n",[57,412,413],{"class":59,"line":155},[57,414,415],{"class":63},"\u002F\u002F Because . matches ANY character!\n",[39,417,168],{"id":418},"the-fix-1",[15,420,421,422,425],{},"Escape metacharacters with ",[54,423,424],{},"\\"," when you want to match them literally.",[47,427,429],{"className":49,"code":428,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ GOOD: Properly escaped\nconst filename = 'document.pdf';\nconst match = filename.match(\u002F\\.pdf$\u002F);\n\u002F\u002F Result: matches only '.pdf' at the end\n\n\u002F\u002F For dynamic patterns, use escape functions\nfunction escapeRegex(string) {\n  return string.replace(\u002F[.*+?^${}()|[\\]\\\\]\u002Fg, '\\\\$&');\n}\nconst ext = '.pdf';\nconst regex = new RegExp(escapeRegex(ext) + '$');\n",[54,430,431,436,448,475,480,486,491,509,551,557,572],{"__ignoreMap":52},[57,432,433],{"class":59,"line":60},[57,434,435],{"class":63},"\u002F\u002F ✅ GOOD: Properly escaped\n",[57,437,438,440,442,444,446],{"class":59,"line":67},[57,439,71],{"class":70},[57,441,370],{"class":74},[57,443,78],{"class":70},[57,445,375],{"class":81},[57,447,86],{"class":85},[57,449,450,452,454,456,458,460,462,464,467,469,471,473],{"class":59,"line":89},[57,451,71],{"class":70},[57,453,94],{"class":74},[57,455,78],{"class":70},[57,457,388],{"class":85},[57,459,103],{"class":102},[57,461,106],{"class":85},[57,463,109],{"class":81},[57,465,466],{"class":125},"\\.",[57,468,399],{"class":112},[57,470,352],{"class":70},[57,472,109],{"class":81},[57,474,134],{"class":85},[57,476,477],{"class":59,"line":137},[57,478,479],{"class":63},"\u002F\u002F Result: matches only '.pdf' at the end\n",[57,481,482],{"class":59,"line":155},[57,483,485],{"emptyLinePlaceholder":484},true,"\n",[57,487,488],{"class":59,"line":161},[57,489,490],{"class":63},"\u002F\u002F For dynamic patterns, use escape functions\n",[57,492,494,497,500,502,506],{"class":59,"line":493},7,[57,495,496],{"class":70},"function",[57,498,499],{"class":102}," escapeRegex",[57,501,106],{"class":85},[57,503,505],{"class":504},"s4XuR","string",[57,507,508],{"class":85},") {\n",[57,510,512,515,518,521,523,525,528,531,533,535,538,540,543,546,549],{"class":59,"line":511},8,[57,513,514],{"class":70},"  return",[57,516,517],{"class":85}," string.",[57,519,520],{"class":102},"replace",[57,522,106],{"class":85},[57,524,109],{"class":81},[57,526,527],{"class":74},"[.*+?^${}()|[",[57,529,530],{"class":125},"\\]\\\\",[57,532,338],{"class":74},[57,534,109],{"class":81},[57,536,537],{"class":70},"g",[57,539,321],{"class":85},[57,541,542],{"class":81},"'",[57,544,545],{"class":74},"\\\\",[57,547,548],{"class":81},"$&'",[57,550,134],{"class":85},[57,552,554],{"class":59,"line":553},9,[57,555,556],{"class":85},"}\n",[57,558,560,562,565,567,570],{"class":59,"line":559},10,[57,561,71],{"class":70},[57,563,564],{"class":74}," ext",[57,566,78],{"class":70},[57,568,569],{"class":81}," '.pdf'",[57,571,86],{"class":85},[57,573,575,577,580,582,585,588,590,593,596,598,601],{"class":59,"line":574},11,[57,576,71],{"class":70},[57,578,579],{"class":74}," regex",[57,581,78],{"class":70},[57,583,584],{"class":70}," new",[57,586,587],{"class":102}," RegExp",[57,589,106],{"class":85},[57,591,592],{"class":102},"escapeRegex",[57,594,595],{"class":85},"(ext) ",[57,597,326],{"class":70},[57,599,600],{"class":81}," '$'",[57,602,134],{"class":85},[10,604,606],{"id":605},"mistake-3-catastrophic-backtracking-redos","Mistake 3: Catastrophic Backtracking (ReDoS)",[39,608,42],{"id":609},"the-problem-2",[15,611,612],{},"Nested quantifiers can cause exponential backtracking on non-matching input.",[47,614,616],{"className":49,"code":615,"language":51,"meta":52,"style":52},"\u002F\u002F ❌ BAD: Catastrophic backtracking\nconst regex = \u002F^(a+)+$\u002F;\nconst test = 'aaaaaaaaaaaaaaaaaaaaX';\n\n\u002F\u002F This will take forever!\nregex.test(test);\n\u002F\u002F Each extra 'a' doubles the steps: 2^n complexity\n",[54,617,618,623,650,664,668,673,684],{"__ignoreMap":52},[57,619,620],{"class":59,"line":60},[57,621,622],{"class":63},"\u002F\u002F ❌ BAD: Catastrophic backtracking\n",[57,624,625,627,629,631,634,636,639,641,643,646,648],{"class":59,"line":67},[57,626,71],{"class":70},[57,628,579],{"class":74},[57,630,78],{"class":70},[57,632,633],{"class":81}," \u002F",[57,635,293],{"class":70},[57,637,638],{"class":112},"(a",[57,640,326],{"class":70},[57,642,333],{"class":112},[57,644,645],{"class":70},"+$",[57,647,109],{"class":81},[57,649,86],{"class":85},[57,651,652,654,657,659,662],{"class":59,"line":89},[57,653,71],{"class":70},[57,655,656],{"class":74}," test",[57,658,78],{"class":70},[57,660,661],{"class":81}," 'aaaaaaaaaaaaaaaaaaaaX'",[57,663,86],{"class":85},[57,665,666],{"class":59,"line":137},[57,667,485],{"emptyLinePlaceholder":484},[57,669,670],{"class":59,"line":155},[57,671,672],{"class":63},"\u002F\u002F This will take forever!\n",[57,674,675,678,681],{"class":59,"line":161},[57,676,677],{"class":85},"regex.",[57,679,680],{"class":102},"test",[57,682,683],{"class":85},"(test);\n",[57,685,686],{"class":59,"line":493},[57,687,688],{"class":63},"\u002F\u002F Each extra 'a' doubles the steps: 2^n complexity\n",[39,690,168],{"id":691},"the-fix-2",[15,693,694],{},"Avoid nested quantifiers. Use a single quantifier or be more specific.",[47,696,698],{"className":49,"code":697,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ GOOD: Single quantifier\nconst regex = \u002F^a+$\u002F;\n\n\u002F\u002F ✅ ALTERNATIVE: If you need to capture groups\nconst regex = \u002F^(a+)$\u002F;  \u002F\u002F No outer +\n\n\u002F\u002F ✅ BEST: Validate length separately if needed\nconst str = 'aaaaaaaaaa';\nif (str.length > 0 && \u002F^a+$\u002F.test(str)) {\n  \u002F\u002F Valid\n}\n",[54,699,700,705,726,730,735,763,767,772,786,823,828],{"__ignoreMap":52},[57,701,702],{"class":59,"line":60},[57,703,704],{"class":63},"\u002F\u002F ✅ GOOD: Single quantifier\n",[57,706,707,709,711,713,715,717,720,722,724],{"class":59,"line":67},[57,708,71],{"class":70},[57,710,579],{"class":74},[57,712,78],{"class":70},[57,714,633],{"class":81},[57,716,293],{"class":70},[57,718,719],{"class":112},"a",[57,721,645],{"class":70},[57,723,109],{"class":81},[57,725,86],{"class":85},[57,727,728],{"class":59,"line":89},[57,729,485],{"emptyLinePlaceholder":484},[57,731,732],{"class":59,"line":137},[57,733,734],{"class":63},"\u002F\u002F ✅ ALTERNATIVE: If you need to capture groups\n",[57,736,737,739,741,743,745,747,749,751,753,755,757,760],{"class":59,"line":155},[57,738,71],{"class":70},[57,740,579],{"class":74},[57,742,78],{"class":70},[57,744,633],{"class":81},[57,746,293],{"class":70},[57,748,638],{"class":112},[57,750,326],{"class":70},[57,752,333],{"class":112},[57,754,352],{"class":70},[57,756,109],{"class":81},[57,758,759],{"class":85},";  ",[57,761,762],{"class":63},"\u002F\u002F No outer +\n",[57,764,765],{"class":59,"line":161},[57,766,485],{"emptyLinePlaceholder":484},[57,768,769],{"class":59,"line":493},[57,770,771],{"class":63},"\u002F\u002F ✅ BEST: Validate length separately if needed\n",[57,773,774,776,779,781,784],{"class":59,"line":511},[57,775,71],{"class":70},[57,777,778],{"class":74}," str",[57,780,78],{"class":70},[57,782,783],{"class":81}," 'aaaaaaaaaa'",[57,785,86],{"class":85},[57,787,788,791,794,797,800,803,806,808,810,812,814,816,818,820],{"class":59,"line":553},[57,789,790],{"class":70},"if",[57,792,793],{"class":85}," (str.",[57,795,796],{"class":74},"length",[57,798,799],{"class":70}," >",[57,801,802],{"class":74}," 0",[57,804,805],{"class":70}," &&",[57,807,633],{"class":81},[57,809,293],{"class":70},[57,811,719],{"class":112},[57,813,645],{"class":70},[57,815,109],{"class":81},[57,817,116],{"class":85},[57,819,680],{"class":102},[57,821,822],{"class":85},"(str)) {\n",[57,824,825],{"class":59,"line":559},[57,826,827],{"class":63},"  \u002F\u002F Valid\n",[57,829,830],{"class":59,"line":574},[57,831,556],{"class":85},[10,833,835],{"id":834},"mistake-4-incorrect-character-class-ranges","Mistake 4: Incorrect Character Class Ranges",[39,837,42],{"id":838},"the-problem-3",[15,840,841],{},"The position of hyphens and carets in character classes matters.",[47,843,845],{"className":49,"code":844,"language":51,"meta":52,"style":52},"\u002F\u002F ❌ BAD: Hyphen in the wrong place creates a range\nconst regex = \u002F[a-z-0-9]\u002F;  \u002F\u002F Matches a-z, hyphen, 0-9 ? NO!\n\u002F\u002F Actually matches: a-z, -, 0, 9 (not 0-9 range!)\n\n\u002F\u002F ❌ BAD: Caret not at the start negates nothing\nconst regex = \u002F[az^]\u002F;  \u002F\u002F Matches 'a', 'z', or '^' (not negated!)\n",[54,846,847,852,872,877,881,886],{"__ignoreMap":52},[57,848,849],{"class":59,"line":60},[57,850,851],{"class":63},"\u002F\u002F ❌ BAD: Hyphen in the wrong place creates a range\n",[57,853,854,856,858,860,862,865,867,869],{"class":59,"line":67},[57,855,71],{"class":70},[57,857,579],{"class":74},[57,859,78],{"class":70},[57,861,633],{"class":81},[57,863,864],{"class":74},"[a-z-0-9]",[57,866,109],{"class":81},[57,868,759],{"class":85},[57,870,871],{"class":63},"\u002F\u002F Matches a-z, hyphen, 0-9 ? NO!\n",[57,873,874],{"class":59,"line":89},[57,875,876],{"class":63},"\u002F\u002F Actually matches: a-z, -, 0, 9 (not 0-9 range!)\n",[57,878,879],{"class":59,"line":137},[57,880,485],{"emptyLinePlaceholder":484},[57,882,883],{"class":59,"line":155},[57,884,885],{"class":63},"\u002F\u002F ❌ BAD: Caret not at the start negates nothing\n",[57,887,888,890,892,894,896,899,901,903],{"class":59,"line":161},[57,889,71],{"class":70},[57,891,579],{"class":74},[57,893,78],{"class":70},[57,895,633],{"class":81},[57,897,898],{"class":74},"[az^]",[57,900,109],{"class":81},[57,902,759],{"class":85},[57,904,905],{"class":63},"\u002F\u002F Matches 'a', 'z', or '^' (not negated!)\n",[39,907,168],{"id":908},"the-fix-3",[15,910,911],{},"Put hyphens at the start or end, and carets at the start.",[47,913,915],{"className":49,"code":914,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ GOOD: Hyphen at the end\nconst regex = \u002F[a-z0-9-]\u002F;  \u002F\u002F Matches a-z, 0-9, or hyphen\n\n\u002F\u002F ✅ GOOD: Negated character class (caret at start)\nconst regex = \u002F[^a-z]\u002F;  \u002F\u002F Matches anything NOT a-z\n\n\u002F\u002F ✅ GOOD: Literal caret (not at start)\nconst regex = \u002F[a^z]\u002F;  \u002F\u002F Matches 'a', '^', or 'z'\n",[54,916,917,922,942,946,951,975,979,984],{"__ignoreMap":52},[57,918,919],{"class":59,"line":60},[57,920,921],{"class":63},"\u002F\u002F ✅ GOOD: Hyphen at the end\n",[57,923,924,926,928,930,932,935,937,939],{"class":59,"line":67},[57,925,71],{"class":70},[57,927,579],{"class":74},[57,929,78],{"class":70},[57,931,633],{"class":81},[57,933,934],{"class":74},"[a-z0-9-]",[57,936,109],{"class":81},[57,938,759],{"class":85},[57,940,941],{"class":63},"\u002F\u002F Matches a-z, 0-9, or hyphen\n",[57,943,944],{"class":59,"line":89},[57,945,485],{"emptyLinePlaceholder":484},[57,947,948],{"class":59,"line":137},[57,949,950],{"class":63},"\u002F\u002F ✅ GOOD: Negated character class (caret at start)\n",[57,952,953,955,957,959,961,963,965,968,970,972],{"class":59,"line":155},[57,954,71],{"class":70},[57,956,579],{"class":74},[57,958,78],{"class":70},[57,960,633],{"class":81},[57,962,290],{"class":74},[57,964,293],{"class":70},[57,966,967],{"class":74},"a-z]",[57,969,109],{"class":81},[57,971,759],{"class":85},[57,973,974],{"class":63},"\u002F\u002F Matches anything NOT a-z\n",[57,976,977],{"class":59,"line":161},[57,978,485],{"emptyLinePlaceholder":484},[57,980,981],{"class":59,"line":493},[57,982,983],{"class":63},"\u002F\u002F ✅ GOOD: Literal caret (not at start)\n",[57,985,986,988,990,992,994,997,999,1001],{"class":59,"line":511},[57,987,71],{"class":70},[57,989,579],{"class":74},[57,991,78],{"class":70},[57,993,633],{"class":81},[57,995,996],{"class":74},"[a^z]",[57,998,109],{"class":81},[57,1000,759],{"class":85},[57,1002,1003],{"class":63},"\u002F\u002F Matches 'a', '^', or 'z'\n",[10,1005,1007,1008,1010],{"id":1006},"mistake-5-using-to-match-everything","Mistake 5: Using ",[54,1009,116],{}," to Match Everything",[39,1012,42],{"id":1013},"the-problem-4",[15,1015,1016,1017,1019],{},"The dot ",[54,1018,116],{}," doesn't match everything — by default it doesn't match newline characters.",[47,1021,1023],{"className":49,"code":1022,"language":51,"meta":52,"style":52},"\u002F\u002F ❌ BAD: . doesn't match newlines\nconst text = 'Line 1\\nLine 2\\nLine 3';\nconst match = text.match(\u002F.*\u002F);\nconsole.log(match[0]);\n\u002F\u002F Result: 'Line 1' (stops at newline!)\n",[54,1024,1025,1030,1055,1080,1092],{"__ignoreMap":52},[57,1026,1027],{"class":59,"line":60},[57,1028,1029],{"class":63},"\u002F\u002F ❌ BAD: . doesn't match newlines\n",[57,1031,1032,1034,1037,1039,1042,1045,1048,1050,1053],{"class":59,"line":67},[57,1033,71],{"class":70},[57,1035,1036],{"class":74}," text",[57,1038,78],{"class":70},[57,1040,1041],{"class":81}," 'Line 1",[57,1043,1044],{"class":74},"\\n",[57,1046,1047],{"class":81},"Line 2",[57,1049,1044],{"class":74},[57,1051,1052],{"class":81},"Line 3'",[57,1054,86],{"class":85},[57,1056,1057,1059,1061,1063,1066,1068,1070,1072,1074,1076,1078],{"class":59,"line":89},[57,1058,71],{"class":70},[57,1060,94],{"class":74},[57,1062,78],{"class":70},[57,1064,1065],{"class":85}," text.",[57,1067,103],{"class":102},[57,1069,106],{"class":85},[57,1071,109],{"class":81},[57,1073,116],{"class":74},[57,1075,119],{"class":70},[57,1077,109],{"class":81},[57,1079,134],{"class":85},[57,1081,1082,1084,1086,1088,1090],{"class":59,"line":137},[57,1083,140],{"class":85},[57,1085,143],{"class":102},[57,1087,146],{"class":85},[57,1089,149],{"class":74},[57,1091,152],{"class":85},[57,1093,1094],{"class":59,"line":155},[57,1095,1096],{"class":63},"\u002F\u002F Result: 'Line 1' (stops at newline!)\n",[39,1098,168],{"id":1099},"the-fix-4",[15,1101,1102,1103,1106,1107,1110],{},"Use ",[54,1104,1105],{},"[\\s\\S]"," or enable the ",[54,1108,1109],{},"s"," (dotAll) flag if available.",[47,1112,1114],{"className":49,"code":1113,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ GOOD: Match any character including newlines\nconst text = 'Line 1\\nLine 2\\nLine 3';\nconst match = text.match(\u002F[\\s\\S]*\u002F);\nconsole.log(match[0]);\n\u002F\u002F Result: 'Line 1\\nLine 2\\nLine 3'\n\n\u002F\u002F ✅ ALTERNATIVE: Use dotAll flag (ES2018+)\nconst match = text.match(\u002F.*\u002Fs);\n\u002F\u002F The 's' flag makes . match newlines\n",[54,1115,1116,1121,1141,1165,1177,1182,1186,1191,1217],{"__ignoreMap":52},[57,1117,1118],{"class":59,"line":60},[57,1119,1120],{"class":63},"\u002F\u002F ✅ GOOD: Match any character including newlines\n",[57,1122,1123,1125,1127,1129,1131,1133,1135,1137,1139],{"class":59,"line":67},[57,1124,71],{"class":70},[57,1126,1036],{"class":74},[57,1128,78],{"class":70},[57,1130,1041],{"class":81},[57,1132,1044],{"class":74},[57,1134,1047],{"class":81},[57,1136,1044],{"class":74},[57,1138,1052],{"class":81},[57,1140,86],{"class":85},[57,1142,1143,1145,1147,1149,1151,1153,1155,1157,1159,1161,1163],{"class":59,"line":89},[57,1144,71],{"class":70},[57,1146,94],{"class":74},[57,1148,78],{"class":70},[57,1150,1065],{"class":85},[57,1152,103],{"class":102},[57,1154,106],{"class":85},[57,1156,109],{"class":81},[57,1158,1105],{"class":74},[57,1160,119],{"class":70},[57,1162,109],{"class":81},[57,1164,134],{"class":85},[57,1166,1167,1169,1171,1173,1175],{"class":59,"line":137},[57,1168,140],{"class":85},[57,1170,143],{"class":102},[57,1172,146],{"class":85},[57,1174,149],{"class":74},[57,1176,152],{"class":85},[57,1178,1179],{"class":59,"line":155},[57,1180,1181],{"class":63},"\u002F\u002F Result: 'Line 1\\nLine 2\\nLine 3'\n",[57,1183,1184],{"class":59,"line":161},[57,1185,485],{"emptyLinePlaceholder":484},[57,1187,1188],{"class":59,"line":493},[57,1189,1190],{"class":63},"\u002F\u002F ✅ ALTERNATIVE: Use dotAll flag (ES2018+)\n",[57,1192,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215],{"class":59,"line":511},[57,1194,71],{"class":70},[57,1196,94],{"class":74},[57,1198,78],{"class":70},[57,1200,1065],{"class":85},[57,1202,103],{"class":102},[57,1204,106],{"class":85},[57,1206,109],{"class":81},[57,1208,116],{"class":74},[57,1210,119],{"class":70},[57,1212,109],{"class":81},[57,1214,1109],{"class":70},[57,1216,134],{"class":85},[57,1218,1219],{"class":59,"line":553},[57,1220,1221],{"class":63},"\u002F\u002F The 's' flag makes . match newlines\n",[10,1223,1225],{"id":1224},"mistake-6-forgetting-word-boundaries","Mistake 6: Forgetting Word Boundaries",[39,1227,42],{"id":1228},"the-problem-5",[15,1230,1231],{},"Matching a word without boundaries can match parts of other words.",[47,1233,1235],{"className":49,"code":1234,"language":51,"meta":52,"style":52},"\u002F\u002F ❌ BAD: Matches inside other words\nconst text = 'The cat scattered the cations.';\nconst matches = text.match(\u002Fcat\u002Fg);\nconsole.log(matches);\n\u002F\u002F Result: ['cat', 'cat', 'cat']\n\u002F\u002F Matched 'cat' in 'cat', 'scat'tered, and 'cation'!\n",[54,1236,1237,1242,1255,1281,1290,1295],{"__ignoreMap":52},[57,1238,1239],{"class":59,"line":60},[57,1240,1241],{"class":63},"\u002F\u002F ❌ BAD: Matches inside other words\n",[57,1243,1244,1246,1248,1250,1253],{"class":59,"line":67},[57,1245,71],{"class":70},[57,1247,1036],{"class":74},[57,1249,78],{"class":70},[57,1251,1252],{"class":81}," 'The cat scattered the cations.'",[57,1254,86],{"class":85},[57,1256,1257,1259,1262,1264,1266,1268,1270,1272,1275,1277,1279],{"class":59,"line":89},[57,1258,71],{"class":70},[57,1260,1261],{"class":74}," matches",[57,1263,78],{"class":70},[57,1265,1065],{"class":85},[57,1267,103],{"class":102},[57,1269,106],{"class":85},[57,1271,109],{"class":81},[57,1273,1274],{"class":112},"cat",[57,1276,109],{"class":81},[57,1278,537],{"class":70},[57,1280,134],{"class":85},[57,1282,1283,1285,1287],{"class":59,"line":137},[57,1284,140],{"class":85},[57,1286,143],{"class":102},[57,1288,1289],{"class":85},"(matches);\n",[57,1291,1292],{"class":59,"line":155},[57,1293,1294],{"class":63},"\u002F\u002F Result: ['cat', 'cat', 'cat']\n",[57,1296,1297],{"class":59,"line":161},[57,1298,1299],{"class":63},"\u002F\u002F Matched 'cat' in 'cat', 'scat'tered, and 'cation'!\n",[39,1301,168],{"id":1302},"the-fix-5",[15,1304,1102,1305,1308],{},[54,1306,1307],{},"\\b"," (word boundary) to match whole words.",[47,1310,1312],{"className":49,"code":1311,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ GOOD: Whole word matching\nconst text = 'The cat scattered the cations.';\nconst matches = text.match(\u002F\\bcat\\b\u002Fg);\nconsole.log(matches);\n\u002F\u002F Result: ['cat']\n\u002F\u002F Only matches 'cat' as a whole word\n",[54,1313,1314,1319,1331,1359,1367,1372],{"__ignoreMap":52},[57,1315,1316],{"class":59,"line":60},[57,1317,1318],{"class":63},"\u002F\u002F ✅ GOOD: Whole word matching\n",[57,1320,1321,1323,1325,1327,1329],{"class":59,"line":67},[57,1322,71],{"class":70},[57,1324,1036],{"class":74},[57,1326,78],{"class":70},[57,1328,1252],{"class":81},[57,1330,86],{"class":85},[57,1332,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351,1353,1355,1357],{"class":59,"line":89},[57,1334,71],{"class":70},[57,1336,1261],{"class":74},[57,1338,78],{"class":70},[57,1340,1065],{"class":85},[57,1342,103],{"class":102},[57,1344,106],{"class":85},[57,1346,109],{"class":81},[57,1348,1307],{"class":70},[57,1350,1274],{"class":112},[57,1352,1307],{"class":70},[57,1354,109],{"class":81},[57,1356,537],{"class":70},[57,1358,134],{"class":85},[57,1360,1361,1363,1365],{"class":59,"line":137},[57,1362,140],{"class":85},[57,1364,143],{"class":102},[57,1366,1289],{"class":85},[57,1368,1369],{"class":59,"line":155},[57,1370,1371],{"class":63},"\u002F\u002F Result: ['cat']\n",[57,1373,1374],{"class":59,"line":161},[57,1375,1376],{"class":63},"\u002F\u002F Only matches 'cat' as a whole word\n",[10,1378,1380],{"id":1379},"mistake-7-incorrect-use-of-capturing-groups","Mistake 7: Incorrect Use of Capturing Groups",[39,1382,42],{"id":1383},"the-problem-6",[15,1385,1386],{},"Unnecessary capturing groups waste memory and can confuse your matches.",[47,1388,1390],{"className":49,"code":1389,"language":51,"meta":52,"style":52},"\u002F\u002F ❌ BAD: Unnecessary capturing\nconst date = '2026-05-26';\nconst match = date.match(\u002F(\\d{4})-(\\d{2})-(\\d{2})\u002F);\n\u002F\u002F Creates 4 capture groups (0=full match, 1=year, 2=month, 3=day)\n\n\u002F\u002F If you only need the full match:\nconst match = date.match(\u002F\\d{4}-\\d{2}-\\d{2}\u002F);\n\u002F\u002F No unnecessary capture groups\n",[54,1391,1392,1397,1411,1456,1461,1465,1470,1507],{"__ignoreMap":52},[57,1393,1394],{"class":59,"line":60},[57,1395,1396],{"class":63},"\u002F\u002F ❌ BAD: Unnecessary capturing\n",[57,1398,1399,1401,1404,1406,1409],{"class":59,"line":67},[57,1400,71],{"class":70},[57,1402,1403],{"class":74}," date",[57,1405,78],{"class":70},[57,1407,1408],{"class":81}," '2026-05-26'",[57,1410,86],{"class":85},[57,1412,1413,1415,1417,1419,1422,1424,1426,1428,1430,1433,1436,1439,1441,1444,1446,1448,1450,1452,1454],{"class":59,"line":89},[57,1414,71],{"class":70},[57,1416,94],{"class":74},[57,1418,78],{"class":70},[57,1420,1421],{"class":85}," date.",[57,1423,103],{"class":102},[57,1425,106],{"class":85},[57,1427,109],{"class":81},[57,1429,106],{"class":112},[57,1431,1432],{"class":74},"\\d",[57,1434,1435],{"class":70},"{4}",[57,1437,1438],{"class":112},")-(",[57,1440,1432],{"class":74},[57,1442,1443],{"class":70},"{2}",[57,1445,1438],{"class":112},[57,1447,1432],{"class":74},[57,1449,1443],{"class":70},[57,1451,333],{"class":112},[57,1453,109],{"class":81},[57,1455,134],{"class":85},[57,1457,1458],{"class":59,"line":137},[57,1459,1460],{"class":63},"\u002F\u002F Creates 4 capture groups (0=full match, 1=year, 2=month, 3=day)\n",[57,1462,1463],{"class":59,"line":155},[57,1464,485],{"emptyLinePlaceholder":484},[57,1466,1467],{"class":59,"line":161},[57,1468,1469],{"class":63},"\u002F\u002F If you only need the full match:\n",[57,1471,1472,1474,1476,1478,1480,1482,1484,1486,1488,1490,1493,1495,1497,1499,1501,1503,1505],{"class":59,"line":493},[57,1473,71],{"class":70},[57,1475,94],{"class":74},[57,1477,78],{"class":70},[57,1479,1421],{"class":85},[57,1481,103],{"class":102},[57,1483,106],{"class":85},[57,1485,109],{"class":81},[57,1487,1432],{"class":74},[57,1489,1435],{"class":70},[57,1491,1492],{"class":112},"-",[57,1494,1432],{"class":74},[57,1496,1443],{"class":70},[57,1498,1492],{"class":112},[57,1500,1432],{"class":74},[57,1502,1443],{"class":70},[57,1504,109],{"class":81},[57,1506,134],{"class":85},[57,1508,1509],{"class":59,"line":511},[57,1510,1511],{"class":63},"\u002F\u002F No unnecessary capture groups\n",[39,1513,168],{"id":1514},"the-fix-6",[15,1516,1517,1518,1521],{},"Use non-capturing groups ",[54,1519,1520],{},"(?:...)"," when you don't need to capture.",[47,1523,1525],{"className":49,"code":1524,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ GOOD: Non-capturing group\nconst text = 'color: red or colour: blue';\nconst match = text.match(\u002Fcolou?r:\u002Fg);\n\u002F\u002F Or with grouping:\nconst match = text.match(\u002Fcol(?:ou)?r:\u002Fg);\n\u002F\u002F Groups without capturing (if you need the group for alternation)\n",[54,1526,1527,1532,1545,1575,1580,1609],{"__ignoreMap":52},[57,1528,1529],{"class":59,"line":60},[57,1530,1531],{"class":63},"\u002F\u002F ✅ GOOD: Non-capturing group\n",[57,1533,1534,1536,1538,1540,1543],{"class":59,"line":67},[57,1535,71],{"class":70},[57,1537,1036],{"class":74},[57,1539,78],{"class":70},[57,1541,1542],{"class":81}," 'color: red or colour: blue'",[57,1544,86],{"class":85},[57,1546,1547,1549,1551,1553,1555,1557,1559,1561,1564,1566,1569,1571,1573],{"class":59,"line":89},[57,1548,71],{"class":70},[57,1550,94],{"class":74},[57,1552,78],{"class":70},[57,1554,1065],{"class":85},[57,1556,103],{"class":102},[57,1558,106],{"class":85},[57,1560,109],{"class":81},[57,1562,1563],{"class":112},"colou",[57,1565,174],{"class":70},[57,1567,1568],{"class":112},"r:",[57,1570,109],{"class":81},[57,1572,537],{"class":70},[57,1574,134],{"class":85},[57,1576,1577],{"class":59,"line":137},[57,1578,1579],{"class":63},"\u002F\u002F Or with grouping:\n",[57,1581,1582,1584,1586,1588,1590,1592,1594,1596,1599,1601,1603,1605,1607],{"class":59,"line":155},[57,1583,71],{"class":70},[57,1585,94],{"class":74},[57,1587,78],{"class":70},[57,1589,1065],{"class":85},[57,1591,103],{"class":102},[57,1593,106],{"class":85},[57,1595,109],{"class":81},[57,1597,1598],{"class":112},"col(?:ou)",[57,1600,174],{"class":70},[57,1602,1568],{"class":112},[57,1604,109],{"class":81},[57,1606,537],{"class":70},[57,1608,134],{"class":85},[57,1610,1611],{"class":59,"line":161},[57,1612,1613],{"class":63},"\u002F\u002F Groups without capturing (if you need the group for alternation)\n",[10,1615,1617],{"id":1616},"mistake-8-not-anchoring-when-you-should","Mistake 8: Not Anchoring When You Should",[39,1619,42],{"id":1620},"the-problem-7",[15,1622,1623,1624,1626,1627,1629],{},"Forgetting ",[54,1625,293],{}," and ",[54,1628,352],{}," can lead to partial matches when you want full string validation.",[47,1631,1633],{"className":49,"code":1632,"language":51,"meta":52,"style":52},"\u002F\u002F ❌ BAD: Partial match considered valid\nconst input = '123abc';\nconst regex = \u002F\\d+\u002F;\nconsole.log(regex.test(input));\n\u002F\u002F Result: true (matched '123', ignored 'abc')\n\n\u002F\u002F This is NOT validating the whole string!\n",[54,1634,1635,1640,1654,1672,1686,1691,1695],{"__ignoreMap":52},[57,1636,1637],{"class":59,"line":60},[57,1638,1639],{"class":63},"\u002F\u002F ❌ BAD: Partial match considered valid\n",[57,1641,1642,1644,1647,1649,1652],{"class":59,"line":67},[57,1643,71],{"class":70},[57,1645,1646],{"class":74}," input",[57,1648,78],{"class":70},[57,1650,1651],{"class":81}," '123abc'",[57,1653,86],{"class":85},[57,1655,1656,1658,1660,1662,1664,1666,1668,1670],{"class":59,"line":89},[57,1657,71],{"class":70},[57,1659,579],{"class":74},[57,1661,78],{"class":70},[57,1663,633],{"class":81},[57,1665,1432],{"class":74},[57,1667,326],{"class":70},[57,1669,109],{"class":81},[57,1671,86],{"class":85},[57,1673,1674,1676,1678,1681,1683],{"class":59,"line":137},[57,1675,140],{"class":85},[57,1677,143],{"class":102},[57,1679,1680],{"class":85},"(regex.",[57,1682,680],{"class":102},[57,1684,1685],{"class":85},"(input));\n",[57,1687,1688],{"class":59,"line":155},[57,1689,1690],{"class":63},"\u002F\u002F Result: true (matched '123', ignored 'abc')\n",[57,1692,1693],{"class":59,"line":161},[57,1694,485],{"emptyLinePlaceholder":484},[57,1696,1697],{"class":59,"line":493},[57,1698,1699],{"class":63},"\u002F\u002F This is NOT validating the whole string!\n",[39,1701,168],{"id":1702},"the-fix-7",[15,1704,1705,1706,1708,1709,1711],{},"Anchor your regex with ",[54,1707,293],{}," (start) and ",[54,1710,352],{}," (end).",[47,1713,1715],{"className":49,"code":1714,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ GOOD: Full string validation\nconst input = '123abc';\nconst regex = \u002F^\\d+$\u002F;\nconsole.log(regex.test(input));\n\u002F\u002F Result: false (because of 'abc')\n\n\u002F\u002F ✅ For whole string matching:\nconst regex = \u002F^[a-z]+$\u002F;  \u002F\u002F Only lowercase letters, whole string\n",[54,1716,1717,1722,1734,1754,1766,1771,1775,1780],{"__ignoreMap":52},[57,1718,1719],{"class":59,"line":60},[57,1720,1721],{"class":63},"\u002F\u002F ✅ GOOD: Full string validation\n",[57,1723,1724,1726,1728,1730,1732],{"class":59,"line":67},[57,1725,71],{"class":70},[57,1727,1646],{"class":74},[57,1729,78],{"class":70},[57,1731,1651],{"class":81},[57,1733,86],{"class":85},[57,1735,1736,1738,1740,1742,1744,1746,1748,1750,1752],{"class":59,"line":89},[57,1737,71],{"class":70},[57,1739,579],{"class":74},[57,1741,78],{"class":70},[57,1743,633],{"class":81},[57,1745,293],{"class":70},[57,1747,1432],{"class":74},[57,1749,645],{"class":70},[57,1751,109],{"class":81},[57,1753,86],{"class":85},[57,1755,1756,1758,1760,1762,1764],{"class":59,"line":137},[57,1757,140],{"class":85},[57,1759,143],{"class":102},[57,1761,1680],{"class":85},[57,1763,680],{"class":102},[57,1765,1685],{"class":85},[57,1767,1768],{"class":59,"line":155},[57,1769,1770],{"class":63},"\u002F\u002F Result: false (because of 'abc')\n",[57,1772,1773],{"class":59,"line":161},[57,1774,485],{"emptyLinePlaceholder":484},[57,1776,1777],{"class":59,"line":493},[57,1778,1779],{"class":63},"\u002F\u002F ✅ For whole string matching:\n",[57,1781,1782,1784,1786,1788,1790,1792,1795,1797,1799,1801],{"class":59,"line":511},[57,1783,71],{"class":70},[57,1785,579],{"class":74},[57,1787,78],{"class":70},[57,1789,633],{"class":81},[57,1791,293],{"class":70},[57,1793,1794],{"class":74},"[a-z]",[57,1796,645],{"class":70},[57,1798,109],{"class":81},[57,1800,759],{"class":85},[57,1802,1803],{"class":63},"\u002F\u002F Only lowercase letters, whole string\n",[10,1805,1807],{"id":1806},"mistake-9-overlooking-case-sensitivity","Mistake 9: Overlooking Case Sensitivity",[39,1809,42],{"id":1810},"the-problem-8",[15,1812,1813],{},"Regex matching is case-sensitive by default.",[47,1815,1817],{"className":49,"code":1816,"language":51,"meta":52,"style":52},"\u002F\u002F ❌ BAD: Case-sensitive by default\nconst text = 'Hello World';\nconst match = text.match(\u002Fhello\u002F);\nconsole.log(match);\n\u002F\u002F Result: null (no match because 'H' != 'h')\n",[54,1818,1819,1824,1837,1860,1869],{"__ignoreMap":52},[57,1820,1821],{"class":59,"line":60},[57,1822,1823],{"class":63},"\u002F\u002F ❌ BAD: Case-sensitive by default\n",[57,1825,1826,1828,1830,1832,1835],{"class":59,"line":67},[57,1827,71],{"class":70},[57,1829,1036],{"class":74},[57,1831,78],{"class":70},[57,1833,1834],{"class":81}," 'Hello World'",[57,1836,86],{"class":85},[57,1838,1839,1841,1843,1845,1847,1849,1851,1853,1856,1858],{"class":59,"line":89},[57,1840,71],{"class":70},[57,1842,94],{"class":74},[57,1844,78],{"class":70},[57,1846,1065],{"class":85},[57,1848,103],{"class":102},[57,1850,106],{"class":85},[57,1852,109],{"class":81},[57,1854,1855],{"class":112},"hello",[57,1857,109],{"class":81},[57,1859,134],{"class":85},[57,1861,1862,1864,1866],{"class":59,"line":137},[57,1863,140],{"class":85},[57,1865,143],{"class":102},[57,1867,1868],{"class":85},"(match);\n",[57,1870,1871],{"class":59,"line":155},[57,1872,1873],{"class":63},"\u002F\u002F Result: null (no match because 'H' != 'h')\n",[39,1875,168],{"id":1876},"the-fix-8",[15,1878,1879,1880,1883],{},"Use the ",[54,1881,1882],{},"i"," flag for case-insensitive matching.",[47,1885,1887],{"className":49,"code":1886,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ GOOD: Case-insensitive flag\nconst text = 'Hello World';\nconst match = text.match(\u002Fhello\u002Fi);\nconsole.log(match[0]);\n\u002F\u002F Result: 'Hello'\n\n\u002F\u002F Or be explicit about case:\nconst match = text.match(\u002F[Hh]ello\u002F);\n",[54,1888,1889,1894,1906,1930,1942,1947,1951,1956],{"__ignoreMap":52},[57,1890,1891],{"class":59,"line":60},[57,1892,1893],{"class":63},"\u002F\u002F ✅ GOOD: Case-insensitive flag\n",[57,1895,1896,1898,1900,1902,1904],{"class":59,"line":67},[57,1897,71],{"class":70},[57,1899,1036],{"class":74},[57,1901,78],{"class":70},[57,1903,1834],{"class":81},[57,1905,86],{"class":85},[57,1907,1908,1910,1912,1914,1916,1918,1920,1922,1924,1926,1928],{"class":59,"line":89},[57,1909,71],{"class":70},[57,1911,94],{"class":74},[57,1913,78],{"class":70},[57,1915,1065],{"class":85},[57,1917,103],{"class":102},[57,1919,106],{"class":85},[57,1921,109],{"class":81},[57,1923,1855],{"class":112},[57,1925,109],{"class":81},[57,1927,1882],{"class":70},[57,1929,134],{"class":85},[57,1931,1932,1934,1936,1938,1940],{"class":59,"line":137},[57,1933,140],{"class":85},[57,1935,143],{"class":102},[57,1937,146],{"class":85},[57,1939,149],{"class":74},[57,1941,152],{"class":85},[57,1943,1944],{"class":59,"line":155},[57,1945,1946],{"class":63},"\u002F\u002F Result: 'Hello'\n",[57,1948,1949],{"class":59,"line":161},[57,1950,485],{"emptyLinePlaceholder":484},[57,1952,1953],{"class":59,"line":493},[57,1954,1955],{"class":63},"\u002F\u002F Or be explicit about case:\n",[57,1957,1958,1960,1962,1964,1966,1968,1970,1972,1975,1978,1980],{"class":59,"line":511},[57,1959,71],{"class":70},[57,1961,94],{"class":74},[57,1963,78],{"class":70},[57,1965,1065],{"class":85},[57,1967,103],{"class":102},[57,1969,106],{"class":85},[57,1971,109],{"class":81},[57,1973,1974],{"class":74},"[Hh]",[57,1976,1977],{"class":112},"ello",[57,1979,109],{"class":81},[57,1981,134],{"class":85},[10,1983,1985],{"id":1984},"mistake-10-using-regex-for-htmlxml-parsing","Mistake 10: Using Regex for HTML\u002FXML Parsing",[39,1987,42],{"id":1988},"the-problem-9",[15,1990,1991],{},"HTML and XML have nested structures that regex can't properly parse.",[47,1993,1995],{"className":49,"code":1994,"language":51,"meta":52,"style":52},"\u002F\u002F ❌ BAD: Trying to parse HTML with regex\nconst html = '\u003Cdiv class=\"outer\">\u003Cdiv class=\"inner\">Text\u003C\u002Fdiv>\u003C\u002Fdiv>';\nconst match = html.match(\u002F\u003Cdiv class=\"outer\">(.*?)\u003C\\\u002Fdiv>\u002F);\nconsole.log(match[1]);\n\u002F\u002F Result: '\u003Cdiv class=\"inner\">Text\u003C\u002Fdiv>'\n\u002F\u002F WRONG! This matched the INNER div's closing tag\n\n\u002F\u002F This approach fails with nested structures!\n",[54,1996,1997,2002,2015,2049,2062,2067,2072,2076],{"__ignoreMap":52},[57,1998,1999],{"class":59,"line":60},[57,2000,2001],{"class":63},"\u002F\u002F ❌ BAD: Trying to parse HTML with regex\n",[57,2003,2004,2006,2008,2010,2013],{"class":59,"line":67},[57,2005,71],{"class":70},[57,2007,75],{"class":74},[57,2009,78],{"class":70},[57,2011,2012],{"class":81}," '\u003Cdiv class=\"outer\">\u003Cdiv class=\"inner\">Text\u003C\u002Fdiv>\u003C\u002Fdiv>'",[57,2014,86],{"class":85},[57,2016,2017,2019,2021,2023,2025,2027,2029,2031,2034,2036,2038,2041,2043,2045,2047],{"class":59,"line":89},[57,2018,71],{"class":70},[57,2020,94],{"class":74},[57,2022,78],{"class":70},[57,2024,99],{"class":85},[57,2026,103],{"class":102},[57,2028,106],{"class":85},[57,2030,109],{"class":81},[57,2032,2033],{"class":112},"\u003Cdiv class=\"outer\">(",[57,2035,116],{"class":74},[57,2037,220],{"class":70},[57,2039,2040],{"class":112},")\u003C",[57,2042,126],{"class":125},[57,2044,129],{"class":112},[57,2046,109],{"class":81},[57,2048,134],{"class":85},[57,2050,2051,2053,2055,2057,2060],{"class":59,"line":137},[57,2052,140],{"class":85},[57,2054,143],{"class":102},[57,2056,146],{"class":85},[57,2058,2059],{"class":74},"1",[57,2061,152],{"class":85},[57,2063,2064],{"class":59,"line":155},[57,2065,2066],{"class":63},"\u002F\u002F Result: '\u003Cdiv class=\"inner\">Text\u003C\u002Fdiv>'\n",[57,2068,2069],{"class":59,"line":161},[57,2070,2071],{"class":63},"\u002F\u002F WRONG! This matched the INNER div's closing tag\n",[57,2073,2074],{"class":59,"line":493},[57,2075,485],{"emptyLinePlaceholder":484},[57,2077,2078],{"class":59,"line":511},[57,2079,2080],{"class":63},"\u002F\u002F This approach fails with nested structures!\n",[39,2082,168],{"id":2083},"the-fix-9",[15,2085,2086],{},"Use a proper HTML\u002FXML parser.",[47,2088,2090],{"className":49,"code":2089,"language":51,"meta":52,"style":52},"\u002F\u002F ✅ GOOD: Use DOMParser for HTML\nconst html = '\u003Cdiv class=\"outer\">\u003Cdiv class=\"inner\">Text\u003C\u002Fdiv>\u003C\u002Fdiv>';\nconst parser = new DOMParser();\nconst doc = parser.parseFromString(html, 'text\u002Fhtml');\nconst outerDiv = doc.querySelector('div.outer');\nconsole.log(outerDiv.innerHTML);\n\u002F\u002F Result: '\u003Cdiv class=\"inner\">Text\u003C\u002Fdiv>' (correct!)\n\n\u002F\u002F For XML, use DOMParser with 'text\u002Fxml'\n\u002F\u002F For Node.js, use 'jsdom' or 'cheerio'\n",[54,2091,2092,2097,2109,2126,2149,2171,2180,2185,2189,2194],{"__ignoreMap":52},[57,2093,2094],{"class":59,"line":60},[57,2095,2096],{"class":63},"\u002F\u002F ✅ GOOD: Use DOMParser for HTML\n",[57,2098,2099,2101,2103,2105,2107],{"class":59,"line":67},[57,2100,71],{"class":70},[57,2102,75],{"class":74},[57,2104,78],{"class":70},[57,2106,2012],{"class":81},[57,2108,86],{"class":85},[57,2110,2111,2113,2116,2118,2120,2123],{"class":59,"line":89},[57,2112,71],{"class":70},[57,2114,2115],{"class":74}," parser",[57,2117,78],{"class":70},[57,2119,584],{"class":70},[57,2121,2122],{"class":102}," DOMParser",[57,2124,2125],{"class":85},"();\n",[57,2127,2128,2130,2133,2135,2138,2141,2144,2147],{"class":59,"line":137},[57,2129,71],{"class":70},[57,2131,2132],{"class":74}," doc",[57,2134,78],{"class":70},[57,2136,2137],{"class":85}," parser.",[57,2139,2140],{"class":102},"parseFromString",[57,2142,2143],{"class":85},"(html, ",[57,2145,2146],{"class":81},"'text\u002Fhtml'",[57,2148,134],{"class":85},[57,2150,2151,2153,2156,2158,2161,2164,2166,2169],{"class":59,"line":155},[57,2152,71],{"class":70},[57,2154,2155],{"class":74}," outerDiv",[57,2157,78],{"class":70},[57,2159,2160],{"class":85}," doc.",[57,2162,2163],{"class":102},"querySelector",[57,2165,106],{"class":85},[57,2167,2168],{"class":81},"'div.outer'",[57,2170,134],{"class":85},[57,2172,2173,2175,2177],{"class":59,"line":161},[57,2174,140],{"class":85},[57,2176,143],{"class":102},[57,2178,2179],{"class":85},"(outerDiv.innerHTML);\n",[57,2181,2182],{"class":59,"line":493},[57,2183,2184],{"class":63},"\u002F\u002F Result: '\u003Cdiv class=\"inner\">Text\u003C\u002Fdiv>' (correct!)\n",[57,2186,2187],{"class":59,"line":511},[57,2188,485],{"emptyLinePlaceholder":484},[57,2190,2191],{"class":59,"line":553},[57,2192,2193],{"class":63},"\u002F\u002F For XML, use DOMParser with 'text\u002Fxml'\n",[57,2195,2196],{"class":59,"line":559},[57,2197,2198],{"class":63},"\u002F\u002F For Node.js, use 'jsdom' or 'cheerio'\n",[10,2200,2202],{"id":2201},"quick-reference-common-fixes","Quick Reference: Common Fixes",[2204,2205,2206,2222],"table",{},[2207,2208,2209],"thead",{},[2210,2211,2212,2216,2219],"tr",{},[2213,2214,2215],"th",{},"Mistake",[2213,2217,2218],{},"Wrong",[2213,2220,2221],{},"Right",[2223,2224,2225,2245,2260,2275,2289,2305,2319,2334,2348],"tbody",{},[2210,2226,2227,2231,2236],{},[2228,2229,2230],"td",{},"Greedy match",[2228,2232,2233],{},[54,2234,2235],{},".*",[2228,2237,2238,2241,2242],{},[54,2239,2240],{},".*?"," or ",[54,2243,2244],{},"[^>]*",[2210,2246,2247,2250,2255],{},[2228,2248,2249],{},"Unescaped dot",[2228,2251,2252],{},[54,2253,2254],{},".pdf",[2228,2256,2257],{},[54,2258,2259],{},"\\.pdf",[2210,2261,2262,2265,2270],{},[2228,2263,2264],{},"Nested quantifiers",[2228,2266,2267],{},[54,2268,2269],{},"(a+)+",[2228,2271,2272],{},[54,2273,2274],{},"a+",[2210,2276,2277,2280,2285],{},[2228,2278,2279],{},"Hyphen in range",[2228,2281,2282],{},[54,2283,2284],{},"[a-z-0]",[2228,2286,2287],{},[54,2288,934],{},[2210,2290,2291,2294,2298],{},[2228,2292,2293],{},"Dot vs newline",[2228,2295,2296],{},[54,2297,116],{},[2228,2299,2300,2241,2302],{},[54,2301,1105],{},[54,2303,2304],{},"\u002F.\u002Fs",[2210,2306,2307,2310,2314],{},[2228,2308,2309],{},"Partial word",[2228,2311,2312],{},[54,2313,1274],{},[2228,2315,2316],{},[54,2317,2318],{},"\\bcat\\b",[2210,2320,2321,2324,2329],{},[2228,2322,2323],{},"No anchoring",[2228,2325,2326],{},[54,2327,2328],{},"\\d+",[2228,2330,2331],{},[54,2332,2333],{},"^\\d+$",[2210,2335,2336,2339,2343],{},[2228,2337,2338],{},"Case sensitive",[2228,2340,2341],{},[54,2342,1855],{},[2228,2344,2345],{},[54,2346,2347],{},"\u002Fhello\u002Fi",[2210,2349,2350,2353,2356],{},[2228,2351,2352],{},"HTML parsing",[2228,2354,2355],{},"Regex",[2228,2357,2358],{},"DOMParser",[10,2360,2362],{"id":2361},"testing-your-regexes","Testing Your Regexes",[15,2364,2365],{},"Always test your regexes with:",[2367,2368,2369,2375,2381,2387],"ol",{},[25,2370,2371,2374],{},[256,2372,2373],{},"Valid input"," — does it match what it should?",[25,2376,2377,2380],{},[256,2378,2379],{},"Invalid input"," — does it reject what it should?",[25,2382,2383,2386],{},[256,2384,2385],{},"Edge cases"," — empty strings, very long strings, special characters",[25,2388,2389,2392],{},[256,2390,2391],{},"Similar but different input"," — make sure you're not over-matching",[47,2394,2396],{"className":49,"code":2395,"language":51,"meta":52,"style":52},"\u002F\u002F Test harness example\nfunction testRegex(regex, validCases, invalidCases) {\n  console.log('Testing:', regex);\n  validCases.forEach(str => {\n    console.assert(regex.test(str), `Should match: ${str}`);\n  });\n  invalidCases.forEach(str => {\n    console.assert(!regex.test(str), `Should not match: ${str}`);\n  });\n}\n\n\u002F\u002F Usage\ntestRegex(\u002F^\\d{4}-\\d{2}-\\d{2}$\u002F, \n  ['2026-05-26', '1999-12-31'],\n  ['2026\u002F05\u002F26', '26-05-2026', '2026-5-6']\n);\n",[54,2397,2398,2403,2427,2442,2461,2486,2491,2506,2532,2536,2540,2544,2550,2584,2601,2622],{"__ignoreMap":52},[57,2399,2400],{"class":59,"line":60},[57,2401,2402],{"class":63},"\u002F\u002F Test harness example\n",[57,2404,2405,2407,2410,2412,2415,2417,2420,2422,2425],{"class":59,"line":67},[57,2406,496],{"class":70},[57,2408,2409],{"class":102}," testRegex",[57,2411,106],{"class":85},[57,2413,2414],{"class":504},"regex",[57,2416,321],{"class":85},[57,2418,2419],{"class":504},"validCases",[57,2421,321],{"class":85},[57,2423,2424],{"class":504},"invalidCases",[57,2426,508],{"class":85},[57,2428,2429,2432,2434,2436,2439],{"class":59,"line":89},[57,2430,2431],{"class":85},"  console.",[57,2433,143],{"class":102},[57,2435,106],{"class":85},[57,2437,2438],{"class":81},"'Testing:'",[57,2440,2441],{"class":85},", regex);\n",[57,2443,2444,2447,2450,2452,2455,2458],{"class":59,"line":137},[57,2445,2446],{"class":85},"  validCases.",[57,2448,2449],{"class":102},"forEach",[57,2451,106],{"class":85},[57,2453,2454],{"class":504},"str",[57,2456,2457],{"class":70}," =>",[57,2459,2460],{"class":85}," {\n",[57,2462,2463,2466,2469,2471,2473,2476,2479,2481,2484],{"class":59,"line":155},[57,2464,2465],{"class":85},"    console.",[57,2467,2468],{"class":102},"assert",[57,2470,1680],{"class":85},[57,2472,680],{"class":102},[57,2474,2475],{"class":85},"(str), ",[57,2477,2478],{"class":81},"`Should match: ${",[57,2480,2454],{"class":85},[57,2482,2483],{"class":81},"}`",[57,2485,134],{"class":85},[57,2487,2488],{"class":59,"line":161},[57,2489,2490],{"class":85},"  });\n",[57,2492,2493,2496,2498,2500,2502,2504],{"class":59,"line":493},[57,2494,2495],{"class":85},"  invalidCases.",[57,2497,2449],{"class":102},[57,2499,106],{"class":85},[57,2501,2454],{"class":504},[57,2503,2457],{"class":70},[57,2505,2460],{"class":85},[57,2507,2508,2510,2512,2514,2517,2519,2521,2523,2526,2528,2530],{"class":59,"line":511},[57,2509,2465],{"class":85},[57,2511,2468],{"class":102},[57,2513,106],{"class":85},[57,2515,2516],{"class":70},"!",[57,2518,677],{"class":85},[57,2520,680],{"class":102},[57,2522,2475],{"class":85},[57,2524,2525],{"class":81},"`Should not match: ${",[57,2527,2454],{"class":85},[57,2529,2483],{"class":81},[57,2531,134],{"class":85},[57,2533,2534],{"class":59,"line":553},[57,2535,2490],{"class":85},[57,2537,2538],{"class":59,"line":559},[57,2539,556],{"class":85},[57,2541,2542],{"class":59,"line":574},[57,2543,485],{"emptyLinePlaceholder":484},[57,2545,2547],{"class":59,"line":2546},12,[57,2548,2549],{"class":63},"\u002F\u002F Usage\n",[57,2551,2553,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576,2579,2581],{"class":59,"line":2552},13,[57,2554,2555],{"class":102},"testRegex",[57,2557,106],{"class":85},[57,2559,109],{"class":81},[57,2561,293],{"class":70},[57,2563,1432],{"class":74},[57,2565,1435],{"class":70},[57,2567,1492],{"class":112},[57,2569,1432],{"class":74},[57,2571,1443],{"class":70},[57,2573,1492],{"class":112},[57,2575,1432],{"class":74},[57,2577,2578],{"class":70},"{2}$",[57,2580,109],{"class":81},[57,2582,2583],{"class":85},", \n",[57,2585,2587,2590,2593,2595,2598],{"class":59,"line":2586},14,[57,2588,2589],{"class":85},"  [",[57,2591,2592],{"class":81},"'2026-05-26'",[57,2594,321],{"class":85},[57,2596,2597],{"class":81},"'1999-12-31'",[57,2599,2600],{"class":85},"],\n",[57,2602,2604,2606,2609,2611,2614,2616,2619],{"class":59,"line":2603},15,[57,2605,2589],{"class":85},[57,2607,2608],{"class":81},"'2026\u002F05\u002F26'",[57,2610,321],{"class":85},[57,2612,2613],{"class":81},"'26-05-2026'",[57,2615,321],{"class":85},[57,2617,2618],{"class":81},"'2026-5-6'",[57,2620,2621],{"class":85},"]\n",[57,2623,2625],{"class":59,"line":2624},16,[57,2626,134],{"class":85},[10,2628,2630],{"id":2629},"summary","Summary",[15,2632,2633],{},"The most common regex mistakes all stem from:",[2367,2635,2636,2645,2653,2659,2665],{},[25,2637,2638,2641,2642,2644],{},[256,2639,2640],{},"Not understanding greediness"," — use ",[54,2643,174],{}," for lazy, or be specific",[25,2646,2647,2650,2651],{},[256,2648,2649],{},"Forgetting to escape"," — metacharacters need ",[54,2652,424],{},[25,2654,2655,2658],{},[256,2656,2657],{},"Creating ReDoS vulnerabilities"," — avoid nested quantifiers",[25,2660,2661,2664],{},[256,2662,2663],{},"Misusing character classes"," — watch hyphen and caret positions",[25,2666,2667,2670],{},[256,2668,2669],{},"Using the wrong tool"," — regex isn't for HTML\u002FXML",[15,2672,2673,2674,2677],{},"Remember: ",[256,2675,2676],{},"A regex that works on valid input might fail spectacularly on invalid input."," Always test both cases!",[10,2679,2681],{"id":2680},"related-tools","Related Tools",[22,2683,2684,2691,2698],{},[25,2685,2686,2690],{},[719,2687,2689],{"href":2688},"\u002Ftools\u002Fregex-tester","Regex Tester"," — Test and debug regex patterns online",[25,2692,2693,2697],{},[719,2694,2696],{"href":2695},"\u002Fguides\u002Fregex-cheat-sheet","Regex Cheat Sheet"," — Quick regex syntax reference",[25,2699,2700,2704],{},[719,2701,2703],{"href":2702},"\u002Fguides\u002Fcommon-regex-patterns","Common Regex Patterns"," — Copy-paste ready patterns",[2706,2707,2708],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sA_wV, html code.shiki .sA_wV{--shiki-default:#032F62;--shiki-dark:#DBEDFF}html pre.shiki code .snhLl, html code.shiki .snhLl{--shiki-default:#22863A;--shiki-default-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":52,"searchDepth":67,"depth":67,"links":2710},[2711,2712,2716,2720,2724,2728,2733,2737,2741,2745,2749,2753,2754,2755,2756],{"id":12,"depth":67,"text":13},{"id":36,"depth":67,"text":37,"children":2713},[2714,2715],{"id":41,"depth":89,"text":42},{"id":167,"depth":89,"text":168},{"id":311,"depth":67,"text":312,"children":2717},[2718,2719],{"id":315,"depth":89,"text":42},{"id":418,"depth":89,"text":168},{"id":605,"depth":67,"text":606,"children":2721},[2722,2723],{"id":609,"depth":89,"text":42},{"id":691,"depth":89,"text":168},{"id":834,"depth":67,"text":835,"children":2725},[2726,2727],{"id":838,"depth":89,"text":42},{"id":908,"depth":89,"text":168},{"id":1006,"depth":67,"text":2729,"children":2730},"Mistake 5: Using . to Match Everything",[2731,2732],{"id":1013,"depth":89,"text":42},{"id":1099,"depth":89,"text":168},{"id":1224,"depth":67,"text":1225,"children":2734},[2735,2736],{"id":1228,"depth":89,"text":42},{"id":1302,"depth":89,"text":168},{"id":1379,"depth":67,"text":1380,"children":2738},[2739,2740],{"id":1383,"depth":89,"text":42},{"id":1514,"depth":89,"text":168},{"id":1616,"depth":67,"text":1617,"children":2742},[2743,2744],{"id":1620,"depth":89,"text":42},{"id":1702,"depth":89,"text":168},{"id":1806,"depth":67,"text":1807,"children":2746},[2747,2748],{"id":1810,"depth":89,"text":42},{"id":1876,"depth":89,"text":168},{"id":1984,"depth":67,"text":1985,"children":2750},[2751,2752],{"id":1988,"depth":89,"text":42},{"id":2083,"depth":89,"text":168},{"id":2201,"depth":67,"text":2202},{"id":2361,"depth":67,"text":2362},{"id":2629,"depth":67,"text":2630},{"id":2680,"depth":67,"text":2681},"2026-05-26","Avoid these 10 common regex mistakes: greedy matching, unescaped metacharacters, backtracking traps, character class errors, and more with clear fixes.","md",{"immutable":484},"\u002Fguides\u002Fregex-common-pitfalls",{"title":5,"description":2758},"guides\u002Fregex-common-pitfalls","xaoqL8ErKjU_t_2WUNC1cGwAWOiCIyudpZWhsmET5gI",1780401324461]