유니코드 정규 표현식
유니코드 속성을 사용하는 정규 표현식 패턴: \p{L}(모든 문자), \p{Script=Greek}(그리스 문자), \p{Emoji}. 언어 및 정규식 엔진에 따라 지원 여부가 다릅니다.
What Are Unicode Regular Expressions?
Unicode regular expressions extend the classical regular expression model to handle Unicode text correctly. The key feature is Unicode property escapes — assertions that match characters based on their Unicode properties rather than specific character ranges.
The most important syntax is \p{Property} (matches characters with the given property) and \P{Property} (matches characters without it). A complementary syntax \p{Property=Value} matches specific property values.
JavaScript Unicode Property Escapes (ES2018)
JavaScript's u flag enables Unicode mode; the v flag (ES2024) adds set notation:
// Script property
/\p{Script=Latin}/u.test("a") // true
/\p{Script=Han}/u.test("中") // true
/\p{Script=Hiragana}/u.test("あ") // true
// General Category
/\p{Letter}/u.test("a") // true
/\p{Decimal_Number}/u.test("5") // true
/\p{Emoji}/u.test("😀") // true
// Derived properties
/\p{Lowercase_Letter}/u.test("a") // true
/\p{Uppercase_Letter}/u.test("A") // true
// Matching all CJK characters
const cjkPattern = /\p{Script=Han}+/u;
cjkPattern.exec("Hello 世界!") // ["世界"]
// Negation
/\P{ASCII}/u.test("café") // true (é is non-ASCII)
// Named Unicode blocks (v flag)
/[\p{Script=Greek}&&\p{Lowercase_Letter}]/v.test("α") // true
Python Unicode Regex (regex module)
Python's built-in re module has limited Unicode support. The third-party regex module provides full Unicode property support:
import regex # pip install regex
# Match Unicode letters (any script)
regex.findall(r"\p{L}+", "Hello, 世界, مرحبا")
# ["Hello", "世界", "مرحبا"]
# Match Unicode digits (includes Arabic-Indic, etc.)
regex.findall(r"\p{Nd}+", "Price: ١٢٣ or 123")
# ["١٢٣", "123"]
# Script-specific
regex.findall(r"\p{Script=Arabic}", "مرحبا Hello")
# ["م", "ر", "ح", "ب", "ا"]
# Category: punctuation
regex.findall(r"\p{P}+", "Hello, world! How's it?")
# [",", "!", "'", "?"]
# Standard re: only basic Unicode support
import re
re.findall(r"\w+", "Hello, 世界", flags=re.UNICODE)
# ["Hello", "世界"] — \w matches Unicode letters with re.UNICODE
Key Unicode Properties for Regex
| Property | Example | Matches |
|---|---|---|
\p{L} |
Letters | Any letter in any script |
\p{Lu} |
Uppercase | A–Z, À, Ω, etc. |
\p{Ll} |
Lowercase | a–z, à, ω, etc. |
\p{N} |
Numbers | Digits, numerals |
\p{Nd} |
Decimal digit | 0–9 and script-native digits |
\p{P} |
Punctuation | .,!? and Unicode punct |
\p{S} |
Symbols | Currency, math, emoji |
\p{Z} |
Separators | Space, line sep, para sep |
\p{Script=Han} |
CJK characters | Chinese/Japanese/Korean ideographs |
\p{Emoji} |
Emoji | All emoji characters |
Practical Validation Examples
// Validate that a username contains only letters, digits, underscores
// Works for all scripts, not just ASCII
function isValidUsername(name) {
return /^[\p{L}\p{N}_]{3,30}$/u.test(name);
}
isValidUsername("user_123") // true
isValidUsername("用户名") // true (Chinese letters)
isValidUsername("<script>") // false
// Extract hashtags including non-Latin
function extractHashtags(text) {
return [...text.matchAll(/#\p{L}[\p{L}\p{N}]*/gu)].map(m => m[0]);
}
extractHashtags("Check #Unicode and #유니코드!")
// ["#Unicode", "#유니코드"]
Grapheme Cluster Matching
The \X pattern in the regex module matches a full grapheme cluster:
import regex
# \X matches one grapheme (not one code point)
regex.findall(r"\X", "café") # ["c", "a", "f", "é"] (4 graphemes)
regex.findall(r"\X", "👨👩👧") # ["👨👩👧"] (1 grapheme)
regex.findall(r"\X", "🇺🇸 flag") # ["🇺🇸", " ", "f", "l", "a", "g"]
Quick Facts
| Property | Value |
|---|---|
| JS syntax | \p{Property} with /u or /v flag |
| JS introduced | ES2018 for \p{}, ES2024 for set notation (/v) |
Python built-in re |
Limited: \w, \d respect Unicode with re.UNICODE |
| Python full support | regex module (PyPI): \p{L}, \X, script properties |
| Grapheme matching | \X in regex module |
| Most useful properties | L (letter), N (number), Script=X, Emoji |
프로그래밍 & 개발의 더 많은 용어
Java strings use UTF-16 internally. char is 16-bit (only BMP). For supplementary …
Python 3 uses Unicode strings by default (str = UTF-8 internally via …
Rust strings (str/String) are guaranteed valid UTF-8. char type represents a Unicode …
U+0000(NUL). 첫 번째 유니코드/ASCII 문자로, C/C++에서 문자열 종료자로 사용됩니다. 보안 위험: 널 …
U+FFFD(). 디코더가 유효하지 않은 바이트 시퀀스를 만났을 때 표시되는 문자 — '디코딩에 …
잘못된 인코딩으로 바이트를 디코딩할 때 생기는 깨진 텍스트. 일본어 용어(文字化け). 예: 'café'를 …
프로그래밍 언어에서 문자의 시퀀스. 내부 표현은 다양합니다: UTF-8(Go, Rust, 최신 Python), UTF-16(Java, …
유니코드 문자열의 '길이'는 단위에 따라 다릅니다: 코드 단위(JavaScript .length), 코드 포인트(Python len()), …
눈에 보이는 글리프가 없는 문자: 공백, 너비 없는 문자, 제어 문자, 서식 …
UTF-16에서 보충 문자를 인코딩하기 위해 함께 사용되는 두 개의 16비트 코드 단위(상위 …