입력값 검증 정규식이 뭘 통과시키고 뭘 거르는지 확인하고, 조건을 골라 정규식을 만들고, 긴 텍스트에서 찾고 바꿉니다.
| ✓ | 건모123 | |
| ✕ | gunmo_dev | 허용 안 됨: _ |
| ✓ | ㄱㄴㄷ | |
| ✓ | 닉네임·별명 | |
| ✕ | 이모지😀 | 허용 안 됨: 😀 |
| ✕ | a/b | 허용 안 됨: / |
| ✓ | [운영자] |
입력 중에 글자를 지우는 필터로 쓸 거면 '한글 낱자'도 켜세요. 조합 중인 ㄱ이 지워져서 한글이 안 써집니다.
/^[a-zA-Z0-9가-힣]{2,10}$//^[a-zA-Z0-9가-힣]{2,10}$/.test(value)value.replace(/[^a-zA-Z0-9가-힣]/g, "")value.matches("^[a-zA-Z0-9가-힣]{2,10}$")value.replaceAll("[^a-zA-Z0-9가-힣]", "")검사는 값 전체가 조건에 맞는지(제출할 때), 입력 필터는 허용 안 되는 글자를 바로 지울 때(입력할 때) 씁니다. 필터는 길이·포함 조건까지는 못 챙기니 제출 때 검사도 같이 하세요.
문의: gunmo.dev@example.com, 잘못된 형식: user@@test, 회사: lee+work@corp.co.kr
매칭되는 부분이 없습니다.
Pattern pattern = Pattern.compile("[\\w.+-]+@([\\w-]+\\.)+[A-Za-z]{2,}");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
String found = matcher.group();
}| 문법 | 의미 | 예 |
|---|---|---|
| \d / \D | 숫자 / 숫자가 아닌 것 | \d{3} → 123 |
| \w / \W | 영문·숫자·_ / 그 외 | \w+ → user_01 |
| \s / \S | 공백(스페이스·탭·줄바꿈) / 그 외 | a\sb → a b |
| . | 줄바꿈을 제외한 아무 문자 (s 플래그면 줄바꿈 포함) | a.c → abc, a1c |
| [abc] / [^abc] | 괄호 안의 문자 하나 / 그 외 | [가-힣]+ → 한글 |
| * + ? | 0번 이상 / 1번 이상 / 0~1번 | colou?r → color, colour |
| {n} {n,} {n,m} | 정확히 n번 / n번 이상 / n~m번 | \d{2,4} |
| *? +? | 게으른(최소) 반복 | <.+?> → 태그 하나씩 |
| ^ $ | 시작 / 끝 (m 플래그면 줄마다) | ^\d+$ → 숫자만인 줄 |
| \b | 단어 경계 | \bcat\b → cat (category는 X) |
| ( ) | 캡처 그룹 → $1, $2 | (\d+)-(\d+) |
| (?: ) | 캡처하지 않는 그룹 | (?:ab)+ |
| (?<name> ) | 이름 그룹 → $<name> | (?<year>\d{4}) |
| a|b | 또는 | jpg|png |
| (?= ) (?! ) | 전방 탐색 / 부정 전방 탐색 | \d+(?=원) → 1000원의 1000 |
| (?<= ) (?<! ) | 후방 탐색 / 부정 후방 탐색 | (?<=\$)\d+ → $50의 50 |
| 항목 | JavaScript | Java |
|---|---|---|
| 문자열 안 역슬래시 | /\d+/ 그대로 | "\\d+" 두 번 |
| 플래그 | /abc/gi | Pattern.CASE_INSENSITIVE 등 상수 |
| 전체 검색 | g 플래그 | while (matcher.find()) |
| 이름 그룹 참조(치환) | $<name> | ${name} |
| 소유 수량자 a*+, 원자 그룹 (?>) | 지원 안 함 (문법 오류) | 지원 |
| \A \Z (입력 시작/끝) | 지원 안 함 | 지원 |
| matches() 전체 일치 | ^...$ 로 직접 | matcher.matches() |
브라우저의 JavaScript 정규식(ECMAScript)으로 실행합니다. 대부분의 문법은 Java와 같지만 몇 가지가 다릅니다. 아래 'JavaScript와 Java의 차이' 표를 참고하세요.
아래 Java 코드 영역이 \d → \\d 처럼 자동으로 이스케이프한 문자열과 Pattern.compile 코드를 만들어 줍니다. 반대로 Java 소스에 있던 "\\d+" 를 그대로 붙여넣고 싶으면 'Java 문자열로 입력'을 켜세요.
정규식은 별도 스레드(Web Worker)에서 실행하고, 1초 안에 끝나지 않으면 강제로 중단합니다. (a+)+$ 같은 중첩 반복은 입력이 조금만 길어도 계산량이 기하급수적으로 늘어나는데(재앙적 역추적), 서버에서 쓰면 ReDoS 공격 대상이 되니 이 경고가 뜨면 패턴을 고치는 게 좋습니다.
아니요. 모든 계산은 브라우저 안에서 이루어지고, 마지막 입력값만 이 브라우저의 localStorage에 저장해 다음에 다시 열었을 때 복원합니다.
g(global)가 없으면 정규식은 첫 번째 매칭에서 멈춥니다. 치환도 첫 번째만 바뀝니다. Java로 치면 g가 있으면 while(matcher.find()) / replaceAll, 없으면 if(matcher.find()) / replaceFirst에 해당합니다.
로그에서 쿼리를 뽑았다면 MyBatis 로그 → SQL로 파라미터까지 채워보세요.