이해하지 못하는 복사-붙여넣기 정규식 중지: 5가지 패턴 설명

작성자

카테고리:

← 피드로
DEV Community · zhihu wu · 2026-06-21 개발(SW)

zhihu wu

Stop Copy-Pasting Regex You Don’t Understand: 5 Patterns Explained

Every developer has done it: you Google “regex for email,” copy the first Stack Overflow answer, paste it into your code, and cross your fingers that it covers all edge cases. Then six months later, [email protected] slips through and breaks something.

Let’s fix that. Here are five regex patterns you probably copy-paste, explained so you actually understand them — and can adapt them yourself.

1. Email Validation: The Pattern Everyone Gets Wrong

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}

Enter fullscreen mode Exit fullscreen mode

Broken down:

  • [a-zA-Z0-9._%+-]+ — username part: letters, digits, dots, underscores, percent, plus, hyphens. The + means “one or more.”
  • @ — literal at sign.
  • [a-zA-Z0-9.-]+ — domain name: letters, digits, dots, hyphens.
  • . — literal dot (escaped because . normally means “any character”).
  • [a-zA-Z]{2,} — TLD: at least 2 letters.

When it fails: Unicode characters in the local part (café@example.com), quoted strings, IP-address domains. For production email validation, send a confirmation link — regex alone can’t guarantee deliverability.

2. URL Extraction: Greedy vs. Lazy Trap

https?://[^s/$.?#].[^s]*

Enter fullscreen mode Exit fullscreen mode

  • https? — “http” optionally followed by “s.” The ? makes the preceding character optional.
  • :// — literal :// (forward slashes must be escaped outside character classes).
  • [^s/$.?#] — match one character that is NOT whitespace, /, $, ., ?, or #. This prevents matching bare punctuation.
  • [^s]* — then match everything until whitespace (s). Note the * (zero or more) — if the URL is followed by a space, it stops there.

Pitfall: The * after [^s] is greedy — always use it with a character class ([^s]) rather than . to avoid gobbling up surrounding text. Test this in the regex tester with URLs embedded in paragraphs to see the difference.

3. IP Address Extraction: Backreference Magic

b(?:d{1,3}.){3}d{1,3}b

Enter fullscreen mode Exit fullscreen mode

  • b — word boundary: ensures we don’t match “192.168.1.1” inside “192.168.1.100”.
  • (?:d{1,3}.) — a non-capturing group (?:): one to three digits followed by a dot. Non-capturing groups group without saving the match.
  • {3} — repeat the group exactly 3 times. So we get 123.45.67.
  • d{1,3} — final octet, no trailing dot.
  • b — word boundary again.

This pattern doesn’t validate IPs — it matches 999.999.999.999. For validation, you’d need a much more complex pattern checking each octet’s range (0-255). This pattern’s job is extraction, not validation — it finds anything that looks like an IP in a log file.

4. Date Extraction (ISO 8601): Character Classes Done Right

d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]d|3[01])

Enter fullscreen mode Exit fullscreen mode

  • d{4} — exactly 4 digits (the year).
  • - — literal hyphen.
  • (0[1-9]|1[0-2]) — month: either 0 followed by 1-9 (Jan-Sep) OR 1 followed by 0-2 (Oct-Dec). The | means “OR.”
  • - — literal hyphen.
  • (0[1-9]|[12]d|3[01]) — day: 0[1-9] (1st-9th) OR [12]d (10-29) OR 3[01] (30-31).

Known limitation: This accepts invalid dates like 2025-02-30. For bulletproof date validation, parse with a date library after the regex confirms the format.

5. The “Everything Between Tags” Problem

<([a-zA-Z][a-zA-Z0-9]*)>(.*?)</1>

Enter fullscreen mode Exit fullscreen mode

  • <([a-zA-Z][a-zA-Z0-9]*)> — opening tag: <, a letter, then optional alphanumeric characters, >. The parentheses capture the tag name.
  • (.*?) — content between tags. The ? after * makes it lazy — stop at the first closing tag, not the last.
  • </1> — closing tag: <, /, then (backreference to the first capture group, the tag name), >.

Without the lazy *?, <.*> applied to <div>hello</div> would match the entire string instead of just <div>. This is the #1 “why isn’t my regex working” moment.

The Debugging Workflow I Actually Use

  1. Start with a known-good preset (email, URL, IPv4 from the tool’s library)
  2. Tweak one thing at a time, watching the match highlights change in real-time
  3. Add edge cases to the test string: empty input, special chars, unicode
  4. Only move to production code when the tester shows exactly what you expect

I use the free Regex Tester at codetoolbox.pro/tools/regex-tester.html for this — it runs entirely in the browser, highlights matches instantly, and shows capture groups individually. No signup, no server uploads.

What’s the regex that burned you the worst? Drop a comment — genuinely curious how many of us have been bitten by the same patterns.

원문에서 계속 ↗

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다