>웹 프론트엔드 >JS 튜토리얼 >정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

青灯夜游
青灯夜游앞으로
2022-03-09 20:13:292208검색

정규식은 문자열 연산을 위한 논리식으로, 텍스트 데이터를 처리할 때 중요하고 복잡한 기술입니다. 그렇다면 정규 표현식을 빠르게 익히는 방법은 무엇입니까? 다음 기사에서는 AST를 통한 학습 방법을 권장합니다. 모두에게 도움이 되기를 바랍니다!

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

정규 표현식은 기본적으로 문자열을 처리하는 데 사용되며 문자열 일치, 추출, 교체에 사용하면 매우 편리합니다.

하지만 욕심쟁이 매칭, 비욕심 매칭, 하위 그룹 캡처, 비캡처 하위 그룹 등의 개념은 여전히 ​​정규식을 배우는 것이 다소 어렵습니다. 몇 년 동안 일했는데 이해가 안 돼요.

정규 표현식을 더 잘 배우는 방법은 무엇입니까? 정규식을 빨리 익히는 방법은 무엇입니까?

내가 생각하기에 매우 좋다고 생각하는 규칙적인 규칙을 배울 수 있는 방법 추천: AST를 통해 학습.

정규식의 일치 원리는 패턴 문자열을 AST로 구문 분석한 다음 이 AST를 사용하여 대상 문자열을 일치시키는 것입니다.

패턴 문자열의 다양한 정보는 구문 분석 후 AST에 저장됩니다. AST는 이름에서 알 수 있듯이 문법적 구조에 따라 구성된 트리입니다. AST의 구조를 보면 정규 표현식이 지원하는 구문을 쉽게 알 수 있습니다.

정규 표현식의 AST를 보는 방법은 무엇입니까?

웹사이트 astexplorer.net을 통해 시각적으로 볼 수 있습니다.

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

분석 언어를 RegExp로 전환하면 정규식의 AST를 시각화할 수 있습니다.

앞서 언급했듯이 AST는 문법에 따라 구성된 트리이므로 그 구조에서 다양한 문법을 ​​쉽게 분류할 수 있습니다.

그럼 AST 관점에서 다양한 구문을 배워보겠습니다.

/abc/

간단한 구문인 /abc/부터 시작해 보겠습니다. 이러한 정규식은 'abc' 문자열과 일치할 수 있으며 해당 AST는 다음과 같습니다. :

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

3 Char, 값은 a, b, c 이고 타입은 간단합니다. 후속 일치는 AST를 순회하여 이 세 문자를 각각 일치시키는 것입니다.

exec API를 사용하여 테스트했습니다.

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

0번째 요소는 일치하는 문자열이고 index는 일치하는 문자열의 시작 인덱스입니다. 입력은 입력 문자열입니다.

특수 문자를 다시 시도해 보겠습니다.

/ddd/

/ddd/는 세 개의 숫자가 일치한다는 의미이고, d는 정규 표현식에서 지원하는 특별한 의미가 있는 메타 문자(메타 문자)입니다.

또한 AST에서 Char이지만 유형이 실제로 메타임을 알 수 있습니다.

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

d의 메타 문자를 통해 모든 숫자를 일치시킬 수 있습니다.

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

어떤 것이 메타 문자이고 어떤 것이 메타 문자인지 간단한 char 이지만 AST를 통해 한눈에 알 수 있습니다.

/[abc]/

Regular는 []를 통해 문자 집합을 지정하는 것을 지원합니다. 즉, 모든 문자와 일치할 수 있습니다.

또한 AST에서 CharacterClass 레이어로 래핑된 것을 볼 수 있습니다. 이는 문자 클래스를 의미합니다. 즉, 포함된 모든 문자와 일치할 수 있습니다.

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

테스트의 경우는 실제로 그렇습니다.

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

/a{1,3}/

정규식은 {from,to} 형식을 사용하여 특정 문자가 반복되는 횟수를 지정하는 것을 지원합니다. ,

예를 들어 /b{1,3}/는 b 문자가 1~3번 반복된다는 의미이고, /[abc]{1,3}/는 a/b/c 문자 클래스가 1번 반복된다는 의미입니다. 3번까지.

AST에서 볼 수 있듯이 이 구문을 Repetition이라고 합니다:

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

수량자를 나타내는 수량자 속성이 있고 여기서 유형은 1부터 3까지의 범위입니다.

Regular는 1~무수한 횟수를 나타내는 +, 0~수많은 횟수를 나타내는 *, 0 또는 1회를 나타내는 ?와 같은 일부 수량자의 약어도 지원합니다.

수량어에는 다양한 유형이 있습니다.

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

일부 학생들은 여기서 탐욕스러운 속성이 무엇을 의미하는지 물을 수 있습니다.

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

greedy는 탐욕스러운 것을 의미합니다. 이 속성은 이 반복이 탐욕스러운 일치인지 비탐욕적인 일치인지를 나타냅니다.

수량자 뒤에 ?를 추가하면 Greedy가 false가 되며, 이는 non-greedy 일치로 전환됨을 의미합니다.

1정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

Greedy와 Non-greedy는 무엇을 의미합니까?

예를 살펴보겠습니다.

1정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

기본 반복 매칭은 탐욕적이며 조건이 충족되는 한 계속 매칭되므로 여기서 acbac를 매칭할 수 있습니다.

Non-greedy로 전환하려면 수량자 뒤에 ?를 추가하면 첫 번째 것만 일치합니다.

1정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

이것은 탐욕스러운 일치와 비탐욕적인 일치라는 것을 AST를 통해 확실히 알 수 있습니다. non-greedy는 반복 구문의 경우, 기본값은 non-greedy로 전환하려면 수량자 뒤에 ?를 추가하는 것입니다.

(aaa)bbb(ccc)

정규 표현식은 ()를 통해 일치하는 문자열의 일부를 하위 그룹으로 반환하는 것을 지원합니다.

AST 살펴보기:

1정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

해당 AST를 그룹이라고 합니다.

그리고 여기에는 기본값이 true인 캡처 속성이 있다는 것을 알 수 있습니다.

1정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

이게 무슨 뜻인가요?

하위 그룹 캡처 구문입니다.

하위군 캡쳐를 원하지 않으면 이렇게(?:aaa)라고 쓰면 됩니다

1정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

보세요, 캡쳐가 거짓이 되었습니다.

캡처와 비캡처의 차이점은 무엇인가요?

해보자:

1정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

아, Group의 캡처 속성이 추출 여부를 나타내는 것으로 밝혀졌습니다.

AST에서

capture가 하위 그룹용임을 알 수 있습니다. 기본값은 하위 그룹의 콘텐츠가 추출된다는 의미입니다. ?:를 통해 비캡처로 전환할 수 있으며 하위 그룹의 콘텐츠는 추출되지 않습니다. .

우리는 이미 AST를 사용하여 정규 구문을 이해하는 데 익숙하지만 좀 더 어려운 것을 살펴보겠습니다.

/bbb(?=ccc)/

정규 표현식은 (?= 구문을 통해 예측 어설션 표현을 지원합니다. xxx) , 특정 문자열 앞에 특정 문자열이 있는지 확인하는 데 사용됩니다.

AST를 통해 이 구문을 Assertion이라고 하며 유형은 예측이라는 것을 알 수 있습니다. 즉, 이전 의미와만 일치한다는 의미입니다.

1정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

이게 무슨 뜻인가요? 왜 이런 글을 쓰나요? /bbb(ccc)/와 /bbb(?:ccc)/의 차이점은 무엇인가요?

해보자:

1정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

결과에서 볼 수 있습니다:

/bbb(ccc)/는 ccc의 하위 그룹과 일치하고 기본 하위 그룹이 캡처되므로 이 하위 그룹을 추출합니다.

/bbb(?:ccc)/는 ccc의 하위 그룹과 일치하지만 ?: 를 통해 캡처하지 않도록 하위 그룹을 설정했기 때문에 추출되지 않습니다.

/bbb(?=ccc)/ ccc와 일치하는 하위 그룹이 추출되지 않아 역시 비캡처임을 나타냅니다. 그것과 ?:의 차이점은 일치 결과에 ccc가 나타나지 않는다는 것입니다.

lookahead 어설션의 특성은 다음과 같습니다.

Lookahead 어설션은 특정 문자열 앞에 특정 문자열이 오고, 해당 하위 그룹이 캡처되지 않으며, 어설션된 문자열이 일치 결과에 나타나지 않음을 의미합니다.

다음에 해당 문자열이 없으면 일치하지 않습니다.

정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

/bbb(?!ccc)/

?=를 ?!로 변경하면 AST를 통해 살펴보세요.

2정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

lookahead 어설션이 여전히 먼저 어설션되지만 true라는 부정적인 속성이 추가로 있습니다.

이 의미는 원래는 앞이 특정 문자열이라는 뜻입니다. 부정 뒤에는 앞이 특정 문자열이 아니라는 뜻입니다.

그러면 일치 결과는 정반대입니다.

2정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

이제 앞에 있는 특정 문자열이 아닌 경우에만 일치합니다. 이는 부정적인 예측 어설션입니다.

/(?

앞의 어설션이 있으면 당연히 후행 어설션도 있게 됩니다. 즉, 뒤에 특정 문자열이 따라오는 경우에만 일치합니다.

2정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

마찬가지로 거부될 수도 있습니다.

2정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

(?

2정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

에 해당하는 AST (?

2정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!

Look-ahead 단언과 Look-Behind 단언은 가장 이해하기 어려운 정규식 구문입니다. AST~

요약

정규식은 문자열에 대한 매우 편리한 도구이지만 아직 배우기가 다소 어려운 부분이 있습니다. 하위 그룹 캡처, 예측 어설션 및 뒤돌아보기 어설션.

AST를 통해 규칙적인 규칙을 학습하는 것이 좋습니다. AST는 문법 구조에 따라 구성된 객체 트리입니다. AST 노드의 이름과 속성을 통해 다양한 구문을 쉽게 명확하게 할 수 있습니다.

예를 들어 AST를 통해 명확히 했습니다.

반복 문법(반복)은 문자 + 수량자 형식입니다. 기본값은 욕심쟁이 일치(greedy is true)이며, 일치하지 않을 때까지 일치한다는 의미입니다. 전환할 수량자 뒤에는 욕심없는 일치가 되며 한 문자가 일치하면 중지됩니다.

하위 그룹 구문(그룹)은 특정 문자열을 추출하는 데 사용됩니다. 기본값은 캡처(캡처가 true)이므로 추출이 필요하다는 의미입니다. (?:xxx)만 일치하면 비캡처로 전환할 수 있습니다. 하지만 추출하지는 않습니다.

Assertion은 그 앞이나 뒤에 특정 문자열이 있다는 뜻으로, Lookahead Assertion과 Lookbehind Assertion으로 구분됩니다. 구문은 (?=xxx)와 (?

다양한 문서의 구문에 대한 깊은 이해인가요, 아니면 컴파일러에서의 구문에 대한 깊은 이해인가요?

물어볼 필요가 없습니다. 컴파일러여야 합니다!

그러면 문서보다 문법에 따라 파싱하는 구문 트리를 통해 자연스럽게 문법을 배우는 것이 더 좋습니다.

정규 표현식도 그렇고, 다른 문법 학습도 그렇죠. AST를 이용해 문법을 배울 수 있다면 굳이 문서를 읽을 필요가 없습니다.

노드 관련 지식을 더 보려면 nodejs 튜토리얼을 방문하세요!

위 내용은 정규식을 빨리 익히는 방법은 무엇입니까? AST를 통해 정규 문법을 배워보세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제