리스 속임수: 패턴, 플래그 및 실제 사례
문자 클래스, 정량표, 앵커, 그룹, 룩어라운드, 플래그 및 일상 작업에 대한 테스트 된 패턴을 가진 실용적인 정규 표현식 속임수 셰이트.
· 4분 분량
정규 표현식은 텍스트를 설명하기 위한 컴팩트 언어입니다. 하나의 줄로 입력값을 검증하고, 로그에서 데이터를 추출하거나 수백 개의 파일의 이름을 변경할 수 있습니다. 하지만 문법은 밀도가 높고 작은 실수도 거의 작동하는 패턴을 만들어냅니다. 이 속임수 시트는 매일 사용할 문법을 수집하고, 사람들을 좌절시키는 부분을 설명하고, 적응할 수 있는 테스트된 패턴으로 끝납니다. 모든 예제들은 자바스크립트 문법을 사용하는데, 이는 또한 파이썬, 자바, Go 및 .NET에 매우 가깝습니다.
[regex tester] (/tools/regex-tester) 에서 각 패턴을 읽으면서 시도해보세요. 하이라이트된 일치를 보는 것이 직관을 만드는 가장 빠른 방법입니다.
문자적 문자와 탈출
대부분의 캐릭터들은 서로 일치합니다. cat는 "고양이"와 일치합니다. 12개의 문자는 특별한 의미를 가지고 있습니다.
. * + ? ^ $ { } ( ) | [ ] \ /
So 3.14 matches "3.14" but also "3x14", while 3\.14 matches only "3.14".
문자 클래스
| 패턴 | 치 |
|---|---|
. |
새줄을 제외한 모든 문자 (s 플래그가 설정되지 않는 경우) |
\d |
숫자 09 |
\w |
단어 문자: 문자, 숫자 또는 하부 표시 |
\s |
빈 공간: 공간, 탭, 뉴라인 |
\D, \W, \S |
위와 같은 반대 |
[abc] |
a, b 또는 c 중 하나 |
[a-z] |
소문자 ASCII 문자 |
[^0-9] |
숫자가 아닌 모든 문자 |
\p{L} |
모든 문자 (u 플래그가 필요합니다) |
사각형 괄호 안에는 대부분의 특수 문자가 의미를 잃습니다. [.]은 문자 그대로의 점과 일치합니다. 직사각형은 첫 번째 또는 마지막에 배치되면 문자입니다: [-a-z].
수량표
| 패턴 | 의미 |
|---|---|
a* |
0 이상 |
a+ |
하나 이상의 |
a? |
0 또는 1 (선택) |
a{3} |
정확히 3번 |
a{2,5} |
2시에서 5시 사이에 |
a{2,} |
2개 이상 |
정량표는 ** 탐욕스러운 **: 그들은 가능한 한 많은 일치 하 고 다시 추적 합니다. ?을 더하면 게으르죠. <b>bold</b>를 감안하면 <.+> 패턴은 전체 문자열과 일치하지만 <.+?>는 <b>만 일치합니다.
항구와 경계
^은 문자열의 시작 또는m플래그와 각각의 줄의 시작과 일치합니다.$은 문자열의 끝, 또는m와 각각의 줄의 끝과 일치합니다.\b는 단어 경계와 일치합니다. 단어 문자와 단어 아닌 문자 사이의 위치입니다.
\bcat\b는 "고양이 앉아"에서 "고양이"와 일치하지만 "연결"에서는 아닙니다. 앵커는 검증에 필수적입니다: \d{5}는 "abc123456"의 어느 곳에서든 5자리를 찾습니다. ^\d{5}$는 전체 입력값이 정확히 5자리가 되어야 합니다.
그룹 및 번갈아
(abc)그룹과 포획 캡처 된 텍스트는$1,$2로 대체되어 있습니다.(?:abc)은 포착하지 않고 그룹을 구성합니다. 이는 더 빠르고 숫자를 깨끗하게 유지합니다.(?<year>\d{4})은match.groups.year로 접근할 수 있는 이름의 그룹입니다.a|b는 A와 B와 일치합니다. 번갈이는 가장 낮은 우선순위를 가지고 있기 때문에^cat|dog$는 "고양이에서 시작" 또는 "개로 끝납니다"를 의미합니다.^(?:cat|dog)$를 사용하여 단어 중 하나와 정확히 일치합니다.\1은 그룹 1의 역 참조입니다.(\w)\1는 "hello"에서 "ll"와 같은 두 배의 글자를 찾습니다.
주변을 둘러봐
룩어라운드는 어떤 것이 문자를 소비하지 않고 현재의 위치 옆에 있는지 아닌지를 주장합니다.
| 패턴 | 의미 |
|---|---|
(?=...) |
긍정적인 전망: 다음으로 |
(?!...) |
부정적 시점: 그 다음에는 |
(?<=...) |
긍정적인 뒤안길: 이전: |
(?<!...) |
네거티브 뷰하인드: |
예제: \d+(?=px)는 "px" 없이 "16px"의 숫자와 일치합니다. (?<=\$)\d+는 달러 표기 뒤에 있는 금액과 일치합니다. ^(?!.*password).*$는 "패스워드"를 포함하지 않는 줄과 일치합니다.
깃발
g(글로벌): 첫 번째에서 멈추는 대신 모든 일치점을 찾습니다.i(불명):a는 "A"와 일치합니다.m(다일선):^와$가 선의 끊기에 일치합니다.s(dotAll):.또한 뉴라인과 일치합니다.u(유니코드): 이모티콘과 같은 대리자 쌍을 단일 문자로 취급하고\p{...}를 활성화합니다.y(sticky): 마지막 경기가 끝난 위치에만 일치합니다.
일상 업무에 대한 패턴
이것 들 은 완전 한 것 이 아니라 실용적 인 것 들 입니다. 실제 검증은 서버 측 검증과 결합되어야 합니다.
** 이메일 (실용성):**
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
@ 또는 도메인이 없어지는 것과 같은 타이핑 오류를 감지합니다. 유일한 진정한 검증은 확인 이메일을 보내는 것입니다.
URL 슬러그:
^[a-z0-9]+(?:-[a-z0-9]+)*$
ISO 날짜 (YYYY-MM-DD):
^(?<year>\d{4})-(?<month>0[1-9]|1[0-2])-(?<day>0[1-9]|[12]\d|3[01])$
이것은 형태와 범위를 확인하지만 2월 31일이 존재하는지 아닌지 확인하지 않습니다. 확인하려면 날짜를 분석합니다.
** 엑스 색상:**
^#(?:[0-9a-fA-F]{3}){1,2}$
IPv4 주소:
^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)$
어용어 버전:
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?$
** 강력한 비밀번호 확인** (최소 12자, 1개의 소문자, 1개의 대문자, 1개의 숫자):
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$
** 트림 빈 공간:** ^\s+|\s+$ (g로) 를 빈 문자열로 대체하십시오.
복제된 공간들을 붕괴시키세요: {2,}을 하나의 공간으로 대체하세요.
** 로그 직선에서 키=값 쌍을 추출합니다:**
(\w+)=("[^"]*"|\S+)
camelCase to snake_case: ([a-z0-9])([A-Z])를 $1_$2로 대체하고 그 다음 소문자로 결과를 표시합니다. 명칭 스타일에 대한 자세한 내용은 camelCase vs snake_case 를 참조하십시오.
성능 및 재난 후 후속 추적
자바스크립트, 파이썬, 자바의 리렉스 엔진은 백트랙링을 사용합니다. 어떤 패턴은 엔진을 거의 일치하는 입력값에서 기하급수적으로 많은 조합을 시도하도록 강요합니다. 대표적인 예로는 ^(a+)+$가 "aaaaaaaaaaaaaaaaaaaa!"와 맞대결을 합니다. 추가 "a"는 작업을 두 배로 증가시키고, 수십 개의 문자는 서버를 동결시킬 수 있습니다. ReDoS로 알려진 서비스 거부 벡터입니다.
피하기 위해:
(a+)+또는(\w*)*에서와 같이 동일한 문자 위에 정량자를 둥글지 마십시오.- 대안을 서로 배제하도록 만들어라:
(a|ab)*은 위험합니다. 구조를 바꾸세요. .*보다 특정 클래스를 선호합니다:"[^"]*"는".*?"보다 안전하고 빠르죠.- 신뢰할 수 없는 데이터와 일치하기 전에 입력 길이 제한.
가독성 팁
- 복잡한 패턴을 점진적으로 만들고 각 조각을 테스트합니다.
- 이름을 가진 그룹을 사용해서
m[2]가 아닌m.groups.month로 코드를 읽습니다. - 복잡한 패턴에 대한 코멘트를 작성하거나, 작은 문자열로 구성합니다.
- 만약 패턴이 한두 줄 이상 필요하다면, 작은 분석기가 더 명확할 수 있는지 생각해보세요.
요약
핵심 클래스, 정량표, 앵커, 그룹, 플래그 를 익히면 대부분의 리게크스를 읽을 수 있습니다. 게으른 정량표와 앵커를 의도적으로 사용하세요. 맥락을 소비하지 않고 필요한 경우 주변을 찾아보세요. 둥지를 틀어 놓은 정량표를 찾아보세요. 패턴을 전송하기 전에 항상 일치하는 것과 일치하지 않는 두 가지 예제를 테스트하세요.
이 페이지는 영어에서 자동 번역되었습니다. 오류를 발견하시면 알려 주세요.