Utilo

리스 속임수: 패턴, 플래그 및 실제 사례

문자 클래스, 정량표, 앵커, 그룹, 룩어라운드, 플래그 및 일상 작업에 대한 테스트 된 패턴을 가진 실용적인 정규 표현식 속임수 셰이트.

· 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로 코드를 읽습니다.
  • 복잡한 패턴에 대한 코멘트를 작성하거나, 작은 문자열로 구성합니다.
  • 만약 패턴이 한두 줄 이상 필요하다면, 작은 분석기가 더 명확할 수 있는지 생각해보세요.

요약

핵심 클래스, 정량표, 앵커, 그룹, 플래그 를 익히면 대부분의 리게크스를 읽을 수 있습니다. 게으른 정량표와 앵커를 의도적으로 사용하세요. 맥락을 소비하지 않고 필요한 경우 주변을 찾아보세요. 둥지를 틀어 놓은 정량표를 찾아보세요. 패턴을 전송하기 전에 항상 일치하는 것과 일치하지 않는 두 가지 예제를 테스트하세요.

이 페이지는 영어에서 자동 번역되었습니다. 오류를 발견하시면 알려 주세요.

관련 가이드