정규 속기 법의 기 교 를 대충 이야기 하 다.
대부분의 사람들 에 게 정규 는 주로 기억 하기 어 려 운 것 이다.사실은 정규 기호 에 대해 기억 을 분류 하면 핵심 개념 이 매우 간단 하 다 는 것 을 알 수 있다.
주:본 고 는 당신 이 적어도 한 번 정규 문 서 를 보 았 다 고 가정 할 것 입 니 다.만약 에 보지 않 았 다 면 mdn(중국어 번역 이 있 음)을 볼 수 있 습 니 다.mdn 조판 이 복잡 하 다 고 생각 되면 https://devdocs.io/javascript/global_objects/regexp 에 가서 공부 하 는 것 을 추천 합 니 다.본문 에서 사용 하 는 언어 는 자바 script 이다.
문자
/a/
중의 a 는 하나의 메타 문자 이 고 하나의 메타 문 자 는 하나의 실체 문자 와 일치 합 니 다.여기 있 는'a'는 특별한 의미 가 없 으 면 영어 a 와 일치 합 니 다./\d/
과 같이 0 에서 9 의 모든 숫자 와 일치 하 며,두 개의 연 결 된 /\d\d/
은 10 에서 99 의 모든 숫자 와 일치 할 수 있다././
은 모든 문자 와 일치 할 수 있 습 니 다.집합 하 다.
만약 에 문자열
'0123456789'
이 있다 면 저 는 그 중의'3','6','9'와 일치 하고 싶 습 니 다.이 때 는 집합 에 /[369]/
을 넣 을 수 있 습 니 다.실행 후 3 만 일치 하 는 것 을 발견 할 수 있 습 니 다.집합 에서 아무리 많은 것 을 써 도 하나의 메타 문 자 를 대표 하고 집합 도 메타 문자 이기 때 문 입 니 다.
이렇게 집합 하 는 것 을 본 적 이 있 을 수 있 습 니 다.
/[0-9a-zA-Z_]/
은 모든 숫자,알파벳 과 밑줄 이 일치 합 니 다.이것 은 메타 문자/\w/의 효과 와 같 고 집합 이 더욱 유연 합 니 다.\w 가 더욱 편리 합 니 다.배제 형 집합
/[^0-9]/
숫자 를 제외 하고 모두 일치 합 니 다.또는(다 중 선택)
만약 에 제 가 많은 책 목록 을 가지 고 있다 고 가정 하면 저 는 그 중에서 naroto 와 one piece 를 일치 시 키 고 싶 습 니 다.그러면
/naroto|one pice/
세로 선 대표 나 a 또는 b 를 쓸 수 있 습 니 다.a|b|c|d 를 여러 개 쓸 수 있 습 니 다.당연히 0|1|2...|9 를 써 서 모든 숫자 와 일치 할 수 있 습 니 다.그러나 집합 과 의 차 이 를 주의해 야 합 니 다.집합 은 하나의 메타 문자 로 단어 와 일치 하지 않 습 니 다.|
양쪽 은 여러 개의 메타 문자 일 수 있 습 니 다.패 킷
나 는 지금 한 무더기 의 파일 을 가지 고 있다.나 는 접미사 가.css 와.less 인 파일 과 일치 하 기 를 바란다.너 는
/.css|.less/
이라는 코드 를 자 연 스 럽 게 쓸 수 있다.사실은 간단 한 쓰기 방법 도 있 습 니 다./.(c|le)ss/
.그룹 을 나 누 면 몇 개의 메타 문 자 를 같은 역할 영역 에 두 고 처리 할 수 있 습 니 다.그룹 을 나 누 면 우 리 는 더욱 세련 된 코드 를 쓸 수 있 습 니 다.그룹 을 나 누 는 데 는 또 하나의 특수 한 용법 이 있 는데,어떻게
'asd_asd_asd_asd_asd'
이라는 문자열 을 맞 출 수 있 는 지 생각 합 니까?정 답 은
/(asd)(_\1)+/,\1
은 매우 특수 한 메타 문자 로 첫 번 째 그룹의 일치 결 과 를 반복 적 으로 사용 하 는 것 을 의미 합 니 다.양사
긴 문자열 문자 에서 나 는 연속 적 인 숫자 만 일치 하고 싶 지만
/\d/
은 하나 만 일치 합 니 다.이 럴 때 양사 /\d{n,}/
을 사용 할 수 있 습 니 다.n 은 몇 번 을 쓰 면 몇 번 이 넘 습 니까?예 를 들 어{1,}은 1 이상 입 니 다.{n}이 표기 법 은 n 개가 연결 되 어 있 음 을 나타 내 며 2333 과 일치 하면 /23{3}/
으로 쓸 수 있 습 니 다.그리고 몇 개의 약자 양사 가 있 습 니 다.
탐욕 모드 와 비 탐욕 모드
양 사 는
/.*a/
으로 '123a123a'
과 일치 하 는 어색 한 점 이 있 는데 '123a'
을 원 했 지만 실제로는 '123a123a'
을 얻 었 다.이것 은 모든 문자 가 /./
과 양 어 를 만족 시 키 기 때문에 처음부터 끝까지 일치 하지만 우 리 는 다른 메타 문자 가 있 기 때문에 이때 정규 엔진 은 역 추적 하여 이미 일치 하 는 결 과 를 뒤에서 하나씩 꺼 내 나머지 메타 문자 와 일치 합 니 다.이런 모델 은 탐욕 모델 이 라 고 하 는데 예상 치 못 한 결과 와 불필요 한 성능 낭 비 를 일 으 킬 수 있다.
해결 방안 은 비 탐욕 모델 을 사용 하 는 것 이다.양사 뒤에
?
물음 표를 붙 이면 가장 작은 결 과 를 얻 을 수 있다.지금 은 /.*?a/
을 사용 하여 매 칭 하면 '123a'
을 얻 을 수 있다.어떤 양사 후에 도 비 탐욕 모드 를 사용 할 수 있다.둘러보다
x(?=y)
이 기능 은 여러 가지 번역 이 있 는데 예 를 들 어 제로 폭 의 단언 이다.저 는 개인 적 으로'긍정 적 으로 둘 러 보 는 것'이 라 고 생각 합 니 다.x(?!y)
정방 향 부정 환시x 는 원 문 자 를 대표 하고 y 도 원 문 자 를 대표 합 니 다.
x(?=y)
은 Y 의 x 를 뜻 합 니 다.예 를 들 어 '-1a--2b-'
은 /\d(?=a)/
을 사용 하여 일치 하면 1 을 얻 을 수 있 습 니 다./\d(?!a)/매 칭 하면 2 를 얻 을 수 있 습 니 다.이 기능 은 어떻게 사용 합 니까?예 를 들 어
'a(123)b'
문자열 이 있 습 니 다.괄호 안에 있 는 내용 만 원 하지만 괄호 를 원 하지 않 습 니 다.나 는 오른쪽 괄호 왼쪽 의 위치 에 일치 해 야 한다.그러면 나 는
/(?=\))/
(괄호 는 전의 가 필요 하 다 는 것 을 주의해 야 한다)이 라 고 쓸 수 있다.나 는 왼쪽 괄호 /[^(]/
을 원 하지 않 는 다.나 는 괄호 안의 내용 /.*/
에 관심 이 없다.이때 세 개의 정규 가 /[^(].*(?=\))/
이 되 었 다.실제로 이 기능 은 위치 와 일치 합 니 다.일치 하 는 위치 부터 원 문 자 를 찾 습 니 다.따라서 둘 러 보 는 뒤에 양 어 를 넣 으 면 소 용이 없습니다.
기타
^
과 $
도 위치 와 일치 하 는 메타 문자 입 니 다.각각 시작 과 끝 이 일치 합 니 다.예 를 들 어 파일 의 끝 이.js 인 파일 은 /.js$/
으로 쓸 수 있 습 니 다.http 시작 과 일치 하 는 링크 는 /^http:\/\//
으로 쓸 수 있 습 니 다.그리고 특수 한\u[\b]\0 등 도 있 습 니 다.문 서 를 직접 봐 야 합 니 다.
식별 자
g:하나의 정규 가 한 번 만 일치 합 니 다.g 식별 자 를 더 하면 전체 가 일치 합 니 다.
/\d/g
.이 정규 는 두 숫자 사이 에 무엇 을 사이 에 두 든 모든 숫자 를 일치 시 킵 니 다.i:대소 문자
/^http:\/\//i
을 구분 하지 않 으 면 http:/와 HTTP://가 일치 합 니 다.핵심 개념 이 이렇게 많 습 니 다.다른 내용 은 문 서 를 자세히 보 세 요.
이게 끝 인 줄 알 아?사실 후속 이 있어 요!
계속 둘 러 보 겠 습 니 다.
그리고 신기 한 역방향 환 시 는
x(?<=y)
을 말 하지 않 았 습 니 다.이것 은 18 년 만 에 정식 기준 에 들 어간 기능 이기 때 문 입 니 다.비록 js 보다 나이 가 많 을 수 있 지만 js 는 당신 을 지지 하지 않 습 니 다.두 렵 지 않 습 니 다!앞 에 있 는 그
/[^(].*(?=\))/
은 /(?<=y).*(?=\))/
으로 바 꿀 수 있 습 니 다.정규 가 가장 크 지만 구 덩이 는 초보 자 들 로 하여 금 정규 적 이 고 못 하 는 것 이 없다 는 생각 을 하 게 하 는 것 이다.복잡 한 문자열 처 리 는 항상 신기 한 정규 로 해결 할 수 있다 고 생각한다.
바로 만능 이 아니다!
아니면 예전 의 예 입 니까?문자
'a(1\(2(3)'
에 괄호 안의 내용 을 어떻게 찾 으 라 고 했 습 니까?먼저 수 요 를 파악 해 야 합 니 다.만약 에 정규 가 너무 쓰기 어 려 우 면 js 의 문자열 처리 함수 로 정규,부분 을 나 누 어 조작 할 수 있 습 니 다.또한 정규 의 성능 은 높 지 않다.복잡 한 조작 을 한 줄 로 쓰 면 정규 성능 이 다른 방식 보다 빠르다 고 해서 테스트 가 없 으 면 발언권 이 없다.정규 이론 적 으로 한계 가 있 습 니 다.예 를 들 어 문자열
1xxxyyyy2
이 있 습 니 다.{n}개 x 와{m}개 y,n 과 m 는 불확실 한 개수 입 니 다.x{1,}y{1,}
으로 쓰 는 것 은 문제 가 없 지만 요구 가 x{n}y{n}
이면 안 됩 니 다.예 를 들 어 하나의 문자열 에 x 가 3 개 있 으 면 y 3 개,x 가 4 개 있 으 면 y 4 개 를 가 져 가 야 합 니 다.정규 만 으로 는 완성 할 수 없습니다.정 규 는 어렵 고 문턱 이 높 으 며 문턱 이 높 아 기억 하기 어렵다.기억 하기 어 려 운 이 유 는 반 인류의 기호 가 의식 적 으로 그것 을 배척 하기 때문이다.정규,정규,정규 를 익히 면 상상 을 초월 하 는 편리 함 을 가 져 다 줄 수 있 습 니 다!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java에서 정규 표현식으로 html 태그 제거자바에서 정규 표현식은 html의 라벨을 제거하는데 주요 목적은 더욱 정확한 내용을 표시하는 것이다. 예를 들어 얼마 전에 블로그에서 글을 발표하는 것과 같은 기능을 했다. 편집기에서 내용을 입력하면 스타일 라벨도 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.