정규 속기 법의 기 교 를 대충 이야기 하 다.

5871 단어 정칙속기
당신 에 게 원 하 는 문자열 을 어떻게 고 르 시 겠 습 니까?왼쪽 에서 오른쪽으로 위 에서 아래로 한 글자 씩 읽 고 if 를 많이 써 서 판단 할 수 있 습 니 다.이렇게 하면 너무 번거롭다.바로 상기 과정 을 추상 화하 고 특정한 기호 로 대부분의 규칙 을 나 타 낼 수 있다.
대부분의 사람들 에 게 정규 는 주로 기억 하기 어 려 운 것 이다.사실은 정규 기호 에 대해 기억 을 분류 하면 핵심 개념 이 매우 간단 하 다 는 것 을 알 수 있다.
주:본 고 는 당신 이 적어도 한 번 정규 문 서 를 보 았 다 고 가정 할 것 입 니 다.만약 에 보지 않 았 다 면 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}/ 으로 쓸 수 있 습 니 다.
그리고 몇 개의 약자 양사 가 있 습 니 다.
  • +대표 1 부터 많 음,{1,}
  • *은 0 에서 많 음 을 나타 내 며{0,}
  • 과 같 습 니 다.
  • ?0 또는 1 개 를 대표 하여{0,1}
  • 과 같 습 니 다.
    탐욕 모드 와 비 탐욕 모드
    양 사 는 /.*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 개 를 가 져 가 야 합 니 다.정규 만 으로 는 완성 할 수 없습니다.
    정 규 는 어렵 고 문턱 이 높 으 며 문턱 이 높 아 기억 하기 어렵다.기억 하기 어 려 운 이 유 는 반 인류의 기호 가 의식 적 으로 그것 을 배척 하기 때문이다.정규,정규,정규 를 익히 면 상상 을 초월 하 는 편리 함 을 가 져 다 줄 수 있 습 니 다!
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기