나는 한 번 하나의 탐욕 수량자에 오후의 대부분을 잃었다. 나는 워드 프레스 마이그레이션을위한 리디렉션지도를 작성하고 있었다 - 새로운 슬러그에 다시 작성해야하는 몇 백 오래된 URL - 그리고 나는이었다 regex 했다 가정된 각 경로에서 후행 슬러그를 포착하기 위해서요. 제 머릿속에서 테스트한 세 개의 URL 에서 작동했습니다. 두 개의 경로 세그먼트가 있는 네 번째 URL 에서는 작동하지 않았습니다. 왜냐하면 .* 는 유쾌하게 첫번째 슬래시와 그 이후의 모든 것을 삼켰다. 규칙은 조용히 사이트의 절반을 잘못된 곳으로 리디렉션했고,나는 나의 테스트에서가 아니라 독자에게서 알게 되었다. 왜냐하면 나의 "testing" 패턴을 응시하고 신뢰하고 있었기 때문이다.
그것이 정규식의 핵심 문제입니다: 어떤 것에 대해 실행하기 전까지는 쓰기 전용입니다. 패턴은 실제 입력이 잘못되었음을 증명하는 순간까지 그럴듯하게 읽혀지며 실패 모드는 조용합니다. 아무것도 일치하지 않는 정규식은 오류를 던지지 않습니다. 너무 많이 일치하는 정규식은 오류를 던지지 않습니다. 미묘하게 잘못된 캡처 그룹이있는 정규식은 잘못된 하위 문자열을 건네주고 계속 이동합니다. 패턴을 알 수있는 유일한 방법은 실제로 보게 될 지저분하고 가장자리 케이스가 가득한 텍스트를 공급하는 것입니다 보세요 그것이 잡는 것에.
A regex 테스터 그 간격을 닫습니다. 당신은 한 상자에 패턴을 넣어,다른 샘플 텍스트,그리고 모든 일치가 장소에 불이 켜집니다 - 캡처 그룹이 밖으로 깨진과 함께 당신은 그룹 1 대 그룹 2 에 착륙 문자열의 정확히 어떤 조각을 볼 수 있습니다. Toolz.dev 에 대해 만든 하나는 browser's 네이티브에서 실행됩니다 RegExp 엔진, 같은 하나의 자바 스크립트와 타입 스크립트 코드가 사용, 그래서 테스터에서 볼 것은 당신이 생산에서 얻을 것입니다. 아니 근사치, 아니 & quot;충분히 닫습니다.& quot;
이 가이드에서는 테스터를 사용하여 패턴을 빠르게 디버깅하는 방법, 각 플래그가 실제로 수행하는 작업, 캡처 그룹 및 명명된 그룹이 출력에 표시되는 방법, Python 또는 PCRE에서 오는 사람들을 트립하는 JavaScript 관련 gotcha를 다룹니다.
TL;DR: 패턴을 붙여넣으세요 Toolz.dev 레젝스 테스터 (슬래시가 필요하지 않음), g/i/m/s/u/y 플래그를 전환하고 아래에 테스트 텍스트를 놓습니다. 일치하는 하이라이트는 색상이 번갈아 표시되며 번호가 매겨지고 명명된 모든 캡처 그룹은 일치마다 나열되며 구문 오류는 engine's 정확한 메시지를 표시합니다. 실제 JavaScript RegExp 엔진을 사용하고 100% 클라이언트 측에서 실행되므로 민감한 로그는 업로드되지 않으며 와 쌍을 이룹니다 정규식 빌더 처음부터 패턴을 조립하기 위한 것입니다.
전체 프로그램을 실행하지 않고 Regex를 어떻게 테스트합니까?
정규식을 디버깅하는 느린 방법은 우리 대부분이 시작하는 루프입니다: 코드의 패턴을 편집하고, 프로그램을 실행하고, 출력을 읽고, 무엇이 잘못되었는지 추측하고, 반복합니다. 모든 반복에는 전체 프로그램 실행 비용이 들고 피드백은 간접적입니다 결과 경기 자체가 아니라 경기의.
테스터는 그 루프를 아무 것도 아닌 것으로 축소합니다. 패턴을 붙여넣고,대표 텍스트를 붙여넣고,일치를 즉시 볼 수 있습니다. 패턴에서 한 문자를 변경하면 하이라이트가 업데이트됩니다. 이렇게 하면 피드백을 가능한 지점까지 조입니다 탐험하기- 시도해 보세요 + 당신이 있었던 곳 *, 단어 경계를 추가하고, 그룹을 캡처하지 않도록 하고, 상상하는 대신 실시간으로 효과가 떨어지는 것을 관찰하세요.
핵심 규율은 사용입니다 진짜 머릿속의 깨끗한 예가 아닌 테스트 텍스트. 내 리디렉션 맵을 깨뜨린 URL 은 두 개의 경로 세그먼트를 가지고 있었다; 내 정신 테스트 케이스에는 하나가 있었다. 내가 테스터에 이전 URL 의 실제 목록을 붙여 넣었다면,탐욕스러운 일치가 라인 4 에서 눈에 띄게 잘못되었을 것입니다. 실제 로그 라인,실제 사용자 입력,실제 파일 경로 - 추악한 것을 포함하여 -를 잡고 테스터가 사용자보다 먼저 패턴이 무너지는 위치를 보여 주도록하십시오.
Regex 플래그는 실제로 무엇을 변경합니까?
플래그는 전체 패턴이 적용되는 방법을 수정하고,그들을 오해하는 것은 "why doesn't this work" moments. The 테스터 6 개의 JavaScript 플래그를 모두 토글로 노출하므로 하나를 뒤집고 결과 이동을 볼 수 있습니다.
g - 글로벌. 그것 없이,일치는 첫번째 명중에서 멈춘다. 그것으로,엔진은 원본에 있는 각 경기를 찾아낸다. 테스터에서는,세계적인 것은 기본적으로 당신이 거의 항상 모든 경기를 보기 원하기 때문에 위에 있다; 단 하나 경기 외침이 좋아하는 무슨을 확인하기 위하여 그것을 끄십시오 String.match 없이 g 돌아올 것이다.
나 - 사건은 무시하세요. 전체 패턴을 대소문자를 구분하지 않게 만듭니다 error 성냥 Error 그리고 ERROR. 똑바로, 그리고 g 후에 가장 많이 사용되는 플래그.
m - 다중선. 이것은 널리 오해되고 있습니다. 그렇습니다 아닙니다 만들다 . 교차선이 끊어집니다. 무엇이 바뀌는지요 ^ 그리고 $ 앵커 대상: with m, 그들은 각각의 시작과 끝에서 일치합니다 라인는,단지 전체 문자열의 시작과 끝이 아니라. you're 로그에서 한 줄씩 일치한다면,당신은 이것을 원한다.
s - dotAll. 만드는 깃발입니다 . 개행 문자를 일치시킵니다. 그것 없이, . 모든 캐릭터와 일치합니다 제외하고 라인 브레이크, 여러 라인을 스팬하기위한 패턴은 종종 조용히 첫 번째 하나에서 중지 이유입니다 당신의 경기가 라인 경계를 넘어야한다면, s 필요한 것은 아닙니다 m.
유 - 유니코드. 전체 유니코드 모드를 활성화합니다 \u{...} 작업을 피하고 대리 쌍을 단일 코드 포인트로 처리하며 문자 클래스를 다음과 같이 만듭니다 \p{Letter} 사용 가능. 텍스트에 이모티콘 또는 비라틴어 스크립트가 있는 경우 중요합니다.
y - 끈적끈적. 각 경기의 앵커는 정확한 위치로 시도합니다 lastIndex따라서 매칭은 정확하게 거기에서 시작하는 경우에만 성공합니다. It's a niche flag used in tokenizers and parsers; 대부분의 일상 업무는 결코 그것에 닿지 않습니다.
가장 많은 시간을 소비하는 혼란은 m 대 s. 사람들은 dotAll 를 의미할 때 다중선을 위해 도달합니다. 당신의 점이 선을 교차하는 isn't 인 경우에,당신은 필요로 합니다 s. 당신의 닻이 선 경계를 명중하는 aren't 인 경우에,당신은 필요로 합니다 m. 그들은 다른 문제를 해결하고 종종 함께 사용됩니다.
캡처 그룹은 출력에 어떻게 표시됩니까?
패턴의 괄호는 두 가지 작업을 수행합니다: 수량자 또는 교대에 대한 하위 패턴을 그룹화합니다 캡처 추출을 위해 일치하는 슬라이스. you're 를 사용하여 텍스트에서 데이터를 가져올 때 - date's 년 및 월,로그 라인's 타임스탬프 및 레벨 - 캡처 그룹이 전체 포인트이며,잘못된 것은 "the 패턴의 가장 일반적인 소스 일치하지만 잘못된 문자열을 얻었습니다."
X-1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 테스터 그 아래에 캡쳐 그룹이 나누어진 모든 매치를 나열합니다. 그룹 1 은 첫 번째 괄호로 묶인 하위 패턴이고,그룹 2 는 두 번째,등등으로 각각은 그 매치에 대해 캡쳐한 정확한 텍스트로 표시됩니다. 이것은 그룹 경계 버그를 명백하게 만듭니다: 그룹 1 이 예상보다 더 많이 잡았다면,이를 보고 괄호를 끌어올릴 수 있습니다.
이름있는 그룹도 같은 대우를 받습니다. 글을 쓸 때 (?<year>\d{4})-(?<month>\d{2})를, 테스터는 캡쳐를 이름으로 보여줍니다 - <year> 그리고 <month>- 번호가 매겨진 등가물과 함께 의존하기 전에 의도한 슬라이스에 대한 이름 맵을 확인할 수 있습니다 match.groups.year 코드에서. 명명된 그룹은 패턴을 자체 문서화하고 코드를 더 읽기 쉽게 만들고 테스터에서 올바르게 해결되는 것을 보는 것이 가장 빠르게 신뢰할 수 있는 방법입니다.
테스터가 서페이스하는 관련 트랩: 패턴에 참여하지만 주어진 시도에서 didn't match 가 "no match"로 표시되는 그룹은 빈 문자열이 아니라 그 구별이 중요합니다. 왜냐하면 JavaScript 에서 그러한 그룹은 undefined그리고 it's 를 가정하는 코드는 항상 문자열이 throw 됩니다. 테스터에 플래그가 지정된 것을 보면 해당 액세스를 보호하라는 메시지가 표시됩니다.
이것은 어떤 Regex 맛이며, 왜 중요한가요?
정규식은 하나의 언어가 아니다.Python's 에서 작동하는 패턴 re 모듈은 다르게 동작할 수 있습니다 - 또는 던지기 - 자바스크립트에서,그 반대도 마찬가지입니다. 이 테스터 자바스크립트를 사용합니다(ECMAScript) 브라우저에 내장된 엔진으로,바이트당 바이트 단위로 동일한 엔진 Node.js 가 실행됩니다. 따라서 만약 you're 가 자바스크립트,타입스크립트, 노드 코드를 작성한다면,여기에서의 결과는 정확히 코드가 할 일입니다.
그 정밀도는 양방향을 절단합니다. PCRE (PHP,and the.PHP,and the.PHP,and the.PHP,and the.PHP,and.PHP,and.PHP,and.PHP,and.PHP,and.PHP,and.PHP,and.PHP,and.PHP,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and.P3,and preg_ 내가 워드프레스 작업에서 끊임없이 사용하는 함수들) 또는 파이썬의 경우,몇몇 기능들은 won't translate. 자바스크립트는 역사적으로 lookbehind 어설션이 부족했고,비교적 최근에 얻었으며,여전히 일부 유니코드 속성 이스케이프를 다르게 처리한다. PCRE 의 소유 수량자와 원자 그룹 don't 는 자바스크립트에 전혀 존재한다. 재귀 - 중첩된 구조를 일치시키기 위한 PCRE 기능은 자바스크립트와 동등하지 않다.
실용적인 결과: test in the flavor you'll deploy in. 하나의 엔진을 충실하게 구현하는 테스터는 그 모든 것의 퍼지 평균을 구현하는 것보다 더 유용합니다. 왜냐하면 "tester" 에서 작동했기 때문입니다; "it 은 내 코드에서 작동할 것입니다." 를 의미해야 합니다; PHP 와 WordPress 작업의 경우 차이점을 염두에 두고 서버 측을 별도로 확인합니다; JavaScript 의 경우 이 테스터 이다 진실의 근원. 언어 인식 검증의 이 종류를 위한 더 넓은 툴킷은에서 커버됩니다 코딩 도구 가이드.
Regex 테스터의 일상적인 용도는 무엇입니까?
검증 패턴 구축 및 디버깅
이메일 필드,전화 번호,우편 번호,슬러그, 의미 버전 문자열 - 모든 양식은 무언가를 검증하고,검증은 일반적으로 regex 입니다. 테스터는 배송하기 전에 패턴에 어색한 경우를 던질 수 있습니다: 플러스 주소 태그가있는 이메일,확장이있는 전화 번호,버전 문자열과 같습니다 1.10.0 순진한 패턴이 잘린다는 것. 실제 값의 열을 붙여넣고 일치하지 않는 값을 확인하세요.
로그에서 데이터 추출
서버 로그,애플리케이션 로그 및 CSV 내보내기는 반구조화된 텍스트이며 regex 는 필드를 그로부터 끌어내는 방법입니다. 캡처 그룹은 타임스탬프,레벨, 요청 ID 를 가져옵니다. tester's per-match 그룹 분석은 정확히 여기에 필요한 뷰입니다. - 12 개의 실제 로그 라인을 붙여넣고,단순한 첫 번째 라인뿐만 아니라 모든 필드에 걸쳐 올바른 그룹에 있는 모든 필드 랜드를 확인합니다. 이것은 와 딱 들어맞습니다 API 디버깅 워크플로 특정 값에 대해 응답 본문과 헤더가 긁히는 경우.
코드베이스 전체에서 검색 및 교체
편집기와 IDE 는 찾기-및-바꾸기에서 regex 를 지원하며,거기의 나쁜 패턴은 의도한 것보다 훨씬 더 많이 다시 쓸 수 있습니다. 테스트하기 매치 당신이 대체 실행하기 전에 전용 테스터의 측면은 저렴한 보험입니다 - 패턴이 대표 샘플에 걸쳐 선택하는 것을 정확하게보고, 다음 자신감을 가지고 대체를 실행합니다 내 리디렉션 - 맵 재해는 근본적으로 내가 먼저 실제 입력에 대해 테스트 한 적이 발견 - 대체했다.
Regex를 배우고 가르칩니다
라이브 하이라이팅은 테스터를 진정한 학습 도구로 만듭니다. 패턴을 한 번에 한 토큰씩 구축하고 앵커,수량화자 및 클래스를 추가하면서 경기 세트가 줄어들고 커지는 것을 지켜보십시오. 보기 \d+ 정수를 잡은 다음 \d grab a single digit does more for understanding than any prose explainment. you're 가 기존의 것을 디버깅하는 것이 아니라 컴포넌트로부터 패턴을 조립할 준비가 되었을 때,the 정규식 빌더 는 동반도구이다.
길이가 0인 매치 트랩을 어떻게 피하나요?
빈 문자열과 일치할 수 있는 패턴 - a*, \d*, (foo)?- 수 "match" 빈 일치의 홍수를 생산 하는 문자 사이의 모든 위치에서. does't 영원히 제로 길이 일치 루프를 지나 전진 순진한 일치 코드. The 테스터 항상 전진하여 내부적으로 이를 방지하므로 결코 매달리지 않지만 그럴 것입니다 쇼 당신은 빈 성냥입니다.
그 디스플레이는 노이즈가 아닌 기능입니다. 빈 일치 더미는 테스터가 당신에게 당신의 수량자가 너무 허용적이라고 말하는 것입니다. 당신이 "one or more digits,"를 의미했다면 당신은 썼다 \d* 당신이 원했을 때 \d+. 그룹이 필요하다면 선택사항으로 표시했습니다 ?. 빈 일치를 보는 것은 수정 사항을 가리키는 진단입니다. 패턴이 맞을 때 일치는 관심있는 하위 문자열이며 다른 것은 아닙니다.
JavaScript Regex와 다른 맛: 빠른 비교
| 특징 | 자바스크립트 (이 테스터) | PCRE(PHP) | 파이썬 re |
|---|---|---|---|
| 명명된 그룹 | (?<name>...) |
(?<name>...) 또는 (?P<name>...) |
(?P<name>...) |
| 뒤를 봐 | 지원됨(현대 엔진) | 지원되는 | 지원되는 |
| 원자 그룹/소유적 | 지원되지 않음 | 지원되는 | 리미티드 |
| 재귀 | 지원되지 않음 | 지원되는 | 지원되지 않음 |
| 점이 개행 플래그와 일치합니다 | s (점전체) |
s (점수) |
re.DOTALL |
유니코드 속성 \p{...} |
필요 u 플래그 |
필요 u 수식어 |
regex 모듈만 |
| 끈끈한 일치 | y 플래그 |
\G 앵커 |
\G- 통해처럼요 match 위치 |
the table's lesson is that "regex" is a family,not a standard. 구문은 충분히 겹쳐서 언어간에 패턴을 복사하도록 당신을 달래고,차이는 정확히 당신이 어려운 문제에 도달하는 고급 기능입니다. 당신의 목표 맛에서 테스트하십시오. 자바 스크립트와 노드의 경우 that's this tester; the 웹 개발자 툴킷 다른 언어별 도구가 적합한 위치를 다룹니다.
민감한 텍스트에 대해 Regex를 테스트하는 것이 안전합니까?
regex 를 테스트하는 텍스트는 종종 민감한 종류입니다: IP 주소 및 사용자 ID 가있는 프로덕션 로그 라인,이메일 주소로 내보내기,내부 호스트 이름이있는 구성 파일. That & # 39;s 정확하게 데이터 당신 should't 서버로 배송하는 도구에 붙여넣습니다.
X-1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X Toolz.dev 레젝스 테스터 브라우저에서 완전히 실행됩니다. 패턴 컴파일,일치, 그룹 추출 - 모든 것이 클라이언트 측 JavaScript 이며,어디서나 패턴이나 텍스트를 전달하는 네트워크 요청이 없습니다. 페이지가 로드된 후 연결을 끊으면 계속 작동합니다. That's an architecture guarantee,not a privacy-policy sent,and it's the set,played out in the set 의 모든 도구 뒤에 있는 동일한 브라우저 우선 원칙 데이터 개인정보 보호 가이드.
이는 실제 로그 라인을 붙여넣을 수 있음을 의미합니다. 즉, 패턴을 만드는 실제 PII가 있는 라인's 가장자리 케이스가 나타나고 안전하게 디버그할 수 있습니다. That's 전체 요점: 테스터는 실제 입력을 제공하는 경우에만 유용하며 실제 입력은 종종 다른 사람에게 보낼 수 있는 것과 정확히 같습니다't other's 서버.
자주 묻는 질문
온라인에서 정규식을 테스트하려면 어떻게 해야 합니까?
주변 슬래시 없이 패턴 필드에 패턴을 입력하고 플래그를 선택한 다음 샘플 텍스트를 테스트 영역에 붙여 넣습니다. 일치 항목은 즉시 강조 표시되고 캡처 그룹은 각 일치 항목에 나열됩니다. 모든 것이 브라우저에서 실행됩니다. 아무 것도 업로드되지 않습니다.
이 테스터는 어떤 정규식 맛을 사용합니까?
브라우저에 내장된 JavaScript (ECMAScript) RegExp 엔진을 사용하는데,이는 Node.js 의 것과 동일합니다. 결과는 JavaScript 와 TypeScript 에서 동일한 패턴이 어떻게 동작하는지 일치합니다. JavaScript regex 는 PCRE,Python's re 모듈,그리고 원자 그룹 및 재귀와 같은 일부 고급 기능의 Java 패턴과 다르므로 배포할 플레이버를 테스트해 보세요.
정규식 플래그 g, i, m 및 s는 무엇을 의미합니까?
g (global) 플래그는 첫 번째에서 멈추는 대신 모든 일치 항목을 찾습니다. i 플래그는 일치 대소문자를 구분하지 않게 만듭니다. m (multiline) 플래그는 ^ 및 $ 앵커를 문자열 시작 및 끝만 일치시키는 것이 아니라 줄 바꿈에서 일치시킵니다. s (dotAll) 플래그는 도트가 개행 문자도 일치하도록 합니다. m 및 s 플래그는 종종 혼동됩니다 - m 은 앵커를 변경하고,s 는 점을 변경합니다.
테스터에서 캡처 그룹은 어떻게 작동합니까?
패턴의 괄호는 캡처 그룹을 만듭니다. 테스터는 모든 매치에 대해 캡처한 텍스트로 번호가 매겨진 각 그룹을 나열하므로 패턴의 각 부분이 문자열의 어느 조각을 잡았는지 확인할 수 있습니다. (?...) 번호가 매겨진 그룹과 함께 이름으로 표시됩니다.
내 정규식이 아무 것도 일치하지 않거나 오류가 발생하는 이유는 무엇입니까?
아무 것도 일치하지 않는 패턴은 일반적으로 지나치게 특정한 문자나 리터럴 도트나 더하기 기호와 같은 이스케이프되지 않은 특수 문자를 갖습니다. 오류를 발생시키는 패턴은 불균형한 괄호나 괄호와 같은 구문 문제를 가지고 있습니다. 테스터는 문제를 빠르게 찾을 수 있도록 engine's 정확한 오류 메시지를 표시합니다.
여러 줄에 어떻게 일치합니까?
줄 바꿈을 스팬하기 위해 점이 필요한 경우 s (dotAll) 플래그를 사용하도록 설정하고, 각 줄의 시작과 끝에서 ^ 및 $ 앵커가 일치하도록 하려면 m (다중 줄) 플래그를 사용하도록 설정합니다. 두 가지를 결합하면 단일 패턴이 로그 또는 CSV 행과 같은 다중 줄 입력에 대해 자연스럽게 작동합니다.
민감한 데이터에 대해 정규식을 테스트하는 것이 안전합니까?
예. 모든 매칭은 브라우저 내부의 JavaScript 에서 이루어집니다 - 패턴이나 테스트 텍스트가 어떤 서버로도 전송되지 않으며,아무것도 기록되지 않으며,도구는 연결이 비활성화된 상태에서 작동합니다. 로그 파일,개인 데이터 또는 독점 형식에 대해 안전하게 테스트할 수 있습니다.
정규식 테스터와 정규식 빌더의 차이점은 무엇입니까?
regex 테스터는 텍스트에 대해 기존 패턴을 실행하여 확인하고 디버깅할 수 있도록 하는 반면,regex 빌더는 구성 요소나 일반적인 템플릿에서 패턴을 구성하는 데 도움을 줍니다. 이 사이트의 Regex 빌더를 사용하여 패턴을 조립한 다음 테스터로 가져와 실제 샘플 데이터와 비교하여 확인합니다.
정규 표현식은 실제 입력에 대해 실행할 때까지 쓰기 전용으로 유지되며 실패는 조용합니다. 일치하는 항목이 없고, 일치하는 항목이 너무 많으며, 잘못된 그룹이 캡처하고, 오류가 알려주지 않습니다. 테스터가 패턴을 표시합니다: regex를 붙여넣으세요, 추악한 실제 텍스트를 입력하고 제작 과정에서 잘못된 것을 포착하기 전에 정확히 무엇을 포착하는지 지켜보세요.



