자동완성 초성 검색
주소록·상품명 검색창에서 사용자가 ㅎㄱ 만 입력해도 '한국', '학교'가 뜨도록 필터 조건을 만듭니다.
HANGUL CHOSUNG · REGEX BUILDER
ㄱㅅ 만 쳐도 '검색'이 나오게
ㄱㅅ 을 넣으면 [가-깋][사-싷] 처럼 초성 검색용 정규식을 만들고 JavaScript·Java·Python 코드 한 줄로 바꿔 줍니다. 아래 테스트 칸에서 어떤 단어가 걸리는지 바로 확인할 수 있습니다.
| 패턴 | - | |
|---|---|---|
| JavaScript | - | |
| Java | - | |
| Python | - |
겹받침(ㄳ 등)과 겹모음(ㅘ 등)은 분해 시 두 자모로 풀고, 결합 시 다시 합칩니다.
| 음절 | 초성 | 중성 | 종성 | 공식 (초성×21+중성)×28+종성+0xAC00 | 코드 |
|---|---|---|---|---|---|
| 위에서 분해를 누르면 채워집니다. | |||||
검색어의 각 글자를 이렇게 바꿉니다. 완성된 음절(검)은 그대로 두고,
초성(ㅅ)은 그 초성으로 시작하는 음절 전체 구간의 문자 클래스로 바꿉니다.
한글 음절은 유니코드에서 (초성×21 + 중성)×28 + 종성 + 0xAC00 공식으로
나열되어 있어서, 초성 인덱스 i 의 구간은
U+AC00 + i×588 부터 588자입니다. ㄱ이면 [가-깋]이 됩니다.
new RegExp(...) 없이 리터럴 그대로 쓰면 됩니다.\\로 두 번 씁니다. 위 Java 칸이 그 형태입니다.r"..." 원시 문자열이면 백슬래시를 그대로 쓸 수 있습니다.글자 c가 음절인지는 '가' <= c && c <= '힣' 로,
초성 인덱스는 (c - 0xAC00) / 588 로 얻습니다. 이 도구의 분해표에서
글자별 인덱스를 확인할 수 있습니다.
겹받침은 초성에 쓰이지 않는 자모라 초성 검색 대상이 아닙니다(초성은 19개뿐입니다). 이 도구에서는 일반 문자로 취급해 이스케이프만 합니다.
각 글자의 초성 인덱스만 비교하면 되므로, 대량 데이터라면 정규식보다 초성 문자열을 미리 뽑아 컬럼/필드로 저장해 두고 LIKE 나 startsWith 로 찾는 편이 빠릅니다. 정규식 방식은 구현이 간단해 자동완성 정도의 규모에 알맞습니다.
전송되지 않습니다. 전부 브라우저의 자바스크립트에서 처리하며 네트워크 요청이 발생하지 않습니다.
관련 도구: 한글 깨짐 복구 · 사업자등록번호 검증 · JSON 포맷터
MADE FOR YOUR WORK
주소록·상품명 검색창에서 사용자가 ㅎㄱ 만 입력해도 '한국', '학교'가 뜨도록 필터 조건을 만듭니다.
검ㅅ 처럼 완성된 글자와 초성이 섞인 입력도 검[사-싷] 으로 바꿔, 타이핑 중간 상태에서도 후보를 좁힙니다.
Java 문자열 이스케이프, Python r-문자열처럼 언어마다 다른 리터럴 규칙을 맞춘 코드 한 줄을 복사해 붙여 넣습니다.
값 → ㄱㅏㅂㅅ 처럼 음절을 자모로 나누고 초성·중성·종성 번호와 코드값을 표로 보며, 받침 유무 판별 로직을 검증합니다.
STEP BY STEP
이렇게 쓰세요
검색어 칸에 ㄱㅅ, 검ㅅ 처럼 초성이나 초성·음절 혼합을 넣습니다. 입력하는 즉시 패턴이 바뀝니다.
'초성 문자 자체도 매칭에 포함'을 켜면 ㄱ 글자도 걸리고, '문자열 시작에서만 매칭(^)'을 켜면 앞부분 일치만 찾습니다.
한 줄에 단어 하나씩 넣으면 줄마다 매칭 여부와 걸린 부분이 표시됩니다.
패턴·JavaScript·Java·Python 줄의 복사 버튼으로 필요한 형태를 가져갑니다. 자모 분해·결합 카드에서는 분해 ↓, 결합 ↑ 버튼을 씁니다.
UNDERSTAND THE BASICS
현대 한글 음절 11,172자는 유니코드 U+AC00(가)부터 U+D7A3(힣)까지 빈틈없이 놓여 있고, 순서가 공식으로 정해져 있습니다. 코드값 = 0xAC00 + (초성 번호 × 21 + 중성 번호) × 28 + 종성 번호. 초성 19개, 중성 21개, 종성은 받침 없음을 포함해 28개이므로 19 × 21 × 28 = 11,172 입니다.
이 공식 덕분에 초성이 같은 음절 588자(21 × 28)는 한 덩어리로 이어집니다. ㄱ으로 시작하는 음절은 '가'부터 '깋'까지, ㅅ은 '사'부터 '싷'까지입니다. 그래서 초성 하나는 [가-깋] 같은 문자 범위 하나가 되고, 초성 검색은 이 범위를 글자 수만큼 이어 붙이면 끝납니다. 사전이나 형태소 분석기가 필요 없습니다.
같은 공식을 거꾸로 풀면 분해가 됩니다. (코드 − 0xAC00) ÷ 588 의 몫이 초성, 나머지를 28로 나눈 몫이 중성, 28로 나눈 나머지가 종성입니다. 종성 번호가 0이면 받침이 없으므로, '을/를'·'이/가' 같은 조사를 고를 때 (코드 − 0xAC00) % 28 === 0 한 줄로 판별할 수 있습니다.
주의할 점은 자모 문자가 두 종류라는 것입니다. 키보드로 친 ㄱ 은 호환용 자모(U+3131~)이고, 음절을 쪼갠 정규화(NFD) 결과는 조합용 자모(U+1100~)입니다. 맥에서 만든 파일 이름처럼 NFD 로 저장된 한글은 [가-힣] 범위에 걸리지 않으니 먼저 NFC 로 합쳐야 합니다.
| 초성 | 정규식 범위 | 시작 코드 |
|---|---|---|
| ㄱ | [가-깋] | U+AC00 |
| ㄴ | [나-닣] | U+B098 |
| ㄷ | [다-딯] | U+B2E4 |
| ㅁ | [마-밓] | U+B9C8 |
| ㅅ | [사-싷] | U+C0AC |
| ㅇ | [아-잏] | U+C544 |
| ㅎ | [하-힣] | U+D558 |
ㄱㅅ 같은 초성으로 검색하는 정규식을 만들어 줍니다. JavaScript·Java·Python 용으로 복사할 수 있고, 그 자리에서 테스트도 됩니다. 한글 음절의 유니코드 자모 분해·결합도 지원합니다. 브라우저에서만 처리되며 입력값을 서버로 보내지 않습니다.
검색할 한글 초성을 입력해 대응하는 정규식과 테스트 결과를 확인하세요. 생성한 패턴은 실제 사용 환경의 정규식 문법에 맞게 검토하세요.
QUICK EXAMPLE
ㄱㅅ
각 초성에 해당하는 한글 음절 범위 생성
초성 검색 패턴과 완성형 문자열의 정확한 일치 검색은 용도가 다릅니다.
한글 완성형 음절은 유니코드에 규칙적으로 놓여 있습니다. 코드포인트 = 0xAC00 + (초성 번호 × 21 + 중성 번호) × 28 + 종성 번호. 초성이 같은 음절 588개(21 × 28)가 빈틈없이 이어져 있다는 뜻입니다.
그래서 초성 하나가 문자 클래스 한 구간이 됩니다. ㄱ은 [가-깋], ㅅ은 [사-싷]입니다. 초성 검색은 이 구간들을 이어 붙이는 것뿐이라 형태소 분석기도 사전도 필요 없습니다.
자모 분해는 같은 식을 나눗셈으로 되돌리고, 결합은 다시 대입해 계산합니다.
언어별로 결과가 달라 보이는 것은 정규식이 아니라 문자열 리터럴 규칙 때문입니다. Java는 백슬래시를 두 번 써야 하고 Python은 r-문자열을 쓰면 그대로 붙여넣을 수 있어서, 언어를 고르면 그 형태로 만들어 줍니다.
BEFORE YOU FINISH
ㄲ 은 ㄱ 과 다른 초성이라 [가-깋] 에 까는 들어 있지 않습니다. ㄱ·ㄲ 구간은 바로 붙어 있으므로, 된소리까지 찾으려면 생성된 패턴을 [가-낗] 처럼 직접 넓히세요.
NFD 로 쪼개진 한글은 눈에는 같아 보여도 음절 범위에 걸리지 않습니다. 검색 전에 JavaScript 는 str.normalize('NFC'), Java 는 Normalizer 로 합치세요.
DB 에서 정규식 조건은 인덱스를 쓰기 어렵습니다. 데이터가 많다면 초성 문자열을 따로 뽑아 컬럼에 저장하고 LIKE 'ㄱㅅ%' 로 찾는 편이 빠릅니다.
초성마다 [가-깋] 같은 범위로 바꾼 정규식을 만들어 test 로 거르면 됩니다. 이 도구가 만든 const re = /…/; 한 줄을 그대로 붙여 넣고 목록.filter(s => re.test(s)) 로 쓰세요.
현대 한글 완성형 음절 11,172자 전체를 뜻하는 범위입니다. ㄱ·ㅏ 같은 낱자모와 옛한글은 들어 있지 않습니다.
음절의 코드값에서 0xAC00 을 뺀 값을 28로 나눈 나머지가 0이면 받침이 없습니다. 이 도구의 음절 분해표에서 종성 번호로 직접 확인할 수 있습니다.
겹받침은 초성으로 쓰이지 않는 자모라 초성 검색 대상이 아닙니다. 이 도구는 이런 글자를 범위로 바꾸지 않고 일반 문자로 둡니다.
정규식에 역슬래시가 들어가면 Java 문자열에서는 두 번 써야 합니다. 이 도구의 Java 줄은 그 규칙을 적용한 Pattern.compile("…") 형태라 그대로 붙여 넣으면 됩니다.
이 도구의 입력 데이터는 브라우저에서 처리하며 도구 기능을 위해 서버로 업로드하지 않습니다. 결과를 공유하기 전 민감한 정보가 없는지 확인하세요.