PhoneGap 소스 코드 분석 6 - 정규 표현 식

12431 단어
정규 표현 식 의 사용 은 매우 광범 위 하고 용법 도 비교적 유연 하지만 평소에 만 나 는 것 은 모두 정규 표현 식 의 간단 한 용법 이다. 이 글 에서 정규 표현 식 을 최대한 간단하게 정리 한 다음 에 전편 에 남 겨 진 문 제 를 분석 할 것 이다.
정규 표현 식 기초
1. 일반 문자: 자모, 숫자, 밑줄, 한자 와 특별한 의미 가 없 는 모든 문자, 예 를 들 어 ABC 123.일치 할 때 같은 문자 와 일치 합 니 다.
2. 특수 문자: (필요 시 역 슬 래 쉬 "\" 를 사용 하여 전의)
문자
속뜻
문자
속뜻
문자
속뜻
문자
속뜻
\a
벨 부
^
일치 하 는 문자열 의 시작 위치
\b
단어의 시작 이나 끝 과 일치 합 니 다.
{n}
n 회 일치
\f
페이지 바 꾸 기
$
일치 하 는 문자열 의 끝 위치
\B
일치 하 는 것 은 단어의 시작 과 끝 이 아 닌 위치 입 니 다.
{n,}
최소 n 회 일치
줄 바 꿈 = \ x0A
()
하위 표현 식 의 시작 과 끝 을 표시 합 니 다.
\d
일치 하 는 숫자
{n,m}
n ~ m 회 일치
\r
Enter 부호 = \ \ x0D
[]
사용자 정의 문자 조합 일치
\D
숫자 가 아 닌 문자 와 일치 합 니 다.
[0-9]
0 에서 9 의 임의의 숫자 와 일치 합 니 다.
\t
탭 문자 = \ x09
{}
일치 하 는 횟수 를 수식 하 는 기호
\s
임의의 공백 문자 일치
[f-m]
f 에서 m 까지 임의의 알파벳 일치
\v
수직 탭 문자 = \ x0B
.
줄 바 꿈 을 제외 한 문자 와 일치 합 니 다.
\S
임의의 공백 문자 일치
 
 
\e
ESC 부적 = \ x1B
?
0 또는 1 회 일치
\w
알파벳 이나 숫자 또는 밑줄 또는 한자 일치
 
 
\xXX
이 번호 의 문자 와 일치 할 수 있 는 16 진수 형식 을 사용 합 니 다.
+
1 번 혹은 여러 번 일치
\W
알파벳, 숫자, 밑줄, 한자 가 아 닌 문자 와 일치 합 니 다.
 
 
\uXXXX
네 자리 16 진법 으로 형식 을 표시 하면 이 번호 의 문자 와 일치 할 수 있 습 니 다.
*
0 또는 여러 번 일치
[^x]
x 를 제외 한 모든 문자 일치
 
 
\x{XXXXXX}
임의의 16 진수 표시 형식 을 사용 하면 이 번호 의 문자 와 일치 할 수 있 습 니 다.
|
좌우 양쪽 표현 식 사이 의 "또는" 관계
[^aeiou]
aeiou 를 제외 한 모든 문자 일치
 
 
위 에 열거 한 이 특수 문자 들 은 대체적으로 다음 과 같이 나 눌 수 있다. 
(1) 쓰기 불편 한 문자: 예 를 들 어 벨 문자 (\ a), 페이지 바 꾸 기 문자 (\ f), 줄 바 꾸 기 문자 (), 리 턴 문자 (\ r), 탭 문자 (\ t), ESC 문자 (\ e)
(2) 16 진수 문자: 예 를 들 어 두 자리 (\ x02), 네 자리 (\ x012B), 임 의 위치 (\ x {A34D 1})
(3) 표시 위치 문자: 예 를 들 어 문자열 시작 (^), 문자열 끝 ($), 단어 시작 과 끝 (\ b), 단어 중간 (\ B)
(4) 표시 횟수 문자: 예 를 들 어 0 또는 1 번 (?), 1 또는 여러 번 (+), 0 또는 여러 번 (*), n 번 ({n}), 최소 n 번 ({n,}), n ~ m 번 ({n, m})
(5) 수식 문자: 예 를 들 어 수식 횟수 ({}), 사용자 정의 조합 일치 ([]), 하위 표현 식 ((())
(6) 반대 문자:
(A) 대소 문자 반 의 를 통 해: 예 를 들 어 \ b 와 \ B, \ d 와 \ D, \ s 와 \ S, \ w 와 \ W
(B) [^] 반 의 를 통 해: 예 를 들 어 [^ x], [^ aeiou]
(C) 기타 특례: 예 를 들 어 화. 도 반 의 를 구성한다.
(7) 범위 문자: 예 를 들 어 숫자 범위 ([0 - 9]), 자모 범위 ([f - m])
(8) 논리 문자: 예 를 들 어 표시 또는 (|)
3. 전의
(1) 역 슬 래 쉬 "\" 전의 단일 문자 사용
(2) "\ \ Q... \ E" 전 의 를 사용 하여 표현 식 중간 에 나타 난 문 자 를 모두 일반 문자 로 합 니 다.
(3) "\ U... \ E" 전 의 를 사용 하여 표현 식 중간 에 나타 난 문 자 를 모두 일반 문자 로 하고 소문 자 를 대문자 로 변환 합 니 다.
(4) "\ L... \ E" 의 미 를 사용 하여 표현 식 중간 에 나타 난 문 자 를 모두 일반 문자 로 하고 대문자 를 소문 자로 변환 합 니 다.
4. 탐욕 모드 와 게 으 름 모드
정규 표현 식 에 횟수 문자 가 포함 되 어 있 을 때 일반적인 상황 에서 가능 한 한 많은 문자 와 일치 합 니 다. 예 를 들 어 l * n 으로 linjisong 과 일치 하면 lin 이 아 닌 linjison 과 일치 합 니 다. 이런 모델 은 정규 표현 식 의 탐욕 모델 입 니 다.이에 대응 하여 문자 '?' 를 추가 하여 게 으 름 모드 로 설정 할 수 있 습 니 다. 즉, 가능 한 한 적은 문자 와 일치 하도록 설정 할 수 있 습 니 다.여 *?반복
5. 그룹 과 역방향 참조
(1) 작은 괄호 ((() 로 표현 식 을 포함 하면 표현 식 을 하나의 전체 로 처리 하여 그룹의 목적 을 달성 할 수 있 습 니 다.
(2) 기본 적 인 상황 에서 각 그룹 은 자동 으로 하나의 그룹 번 호 를 가 져 오고 왼쪽 괄호 의 순서에 따라 1 에서 뒤로 번 호 를 매 긴 다.
(3) 엔진 은 처리 할 때 소괄호 내부 표현 식 이 일치 하 는 내용 을 저장 하여 일치 하 는 과정 이나 일치 가 끝 난 후에 처리 할 수 있 도록 합 니 다. 이 내용 을 참조 할 수 있 습 니 다. 예 를 들 어 \ 1 은 첫 번 째 그룹 이 일치 하 는 텍스트 를 표시 합 니 다.
(4) 그룹 이름 도 사용자 정의 할 수 있 습 니 다. 문법 은 (? exp) 입 니 다. 이 럴 때 반대로 인용 할 때 \ k 를 사용 할 수 있 습 니 다.
(5) 일치 하 는 내용 을 저장 하지 않 아 도 되 고 그룹 번호 도 할당 하지 않 아 도 됩 니 다. 문법 은 (?: exp) 입 니 다.
(6) 작은 괄호 에는 다른 특수 문법 이 있 는데 여기 몇 가 지 를 열거 하고 더 이상 깊이 토론 하지 않 는 다.
분류 하 다.
코드 / 문법
설명 하 다.
포획 하 다.
(exp)
exp 와 일치 하고 자동 으로 이름 이 붙 은 그룹 에 텍스트 를 캡 처 합 니 다.
(?exp)
exp 와 일치 하고 이름 이 name 인 그룹 에 텍스트 를 캡 처 할 수도 있 습 니 다. (? 'name' exp)
(?:exp)
exp 와 일치 합 니 다. 일치 하 는 텍스트 를 캡 처 하지 않 고 이 그룹 에 그룹 번 호 를 할당 하지 않 습 니 다.
너그러이 단언 하 다
(?=exp)
exp 앞 위치 일치
(?<=exp)
exp 뒤의 위치 와 일치 합 니 다.
(?!exp)
뒤에 있 는 것 과 일치 하 는 것 은 exp 의 위치 가 아 닙 니 다.
(?
앞 에 exp 가 아 닌 위치 와 일치 합 니 다.
주석
(?#comment)
이러한 유형의 그룹 은 정규 표현 식 의 처리 에 영향 을 주지 않 고 주석 을 제공 하여 읽 을 수 있 도록 합 니 다.
이 쯤 에서 전편 에 나 온 정규 표현 식 을 이해 하 는 것 만으로 도 충분 합 니 다. 정규 표현 식 을 계속 배우 고 싶다 면 정규 표현 식 30 분 입문 튜 토리 얼 을 참고 하 십시오. 자 바스 크 립 트 의 정규 표현 식 구현 에 대해 다시 한번 알 아 보 겠 습 니 다.
2. Javascript 의 정규 표현 식
1. 정규 표현 식 만 들 기
(1) 글자 사용량: 문법 var exp = / pattern / flags;
A. pattern 은 모든 정규 표현 식 입 니 다.
B. flags 는 세 가지 가 있 습 니 다. g 는 전체 모드 를 표시 하고 i 는 대소 문 자 를 무시 하 며 m 는 여러 줄 모드 를 표시 합 니 다.
(2) RegExp 내장 구조 함수 사용: 문법 var exp = new RegExp (pattern, flags);
A. 구조 함 수 를 사용 할 때 pattern 과 flags 는 모두 문자열 형식 이기 때문에 전의 문자 에 대해 이중 전의 가 필요 합 니 다. 예 를 들 어:
글자 의 양
구조 함수
/\[bc\]at/
"\\[bc\\]at"
/\.at/
"\\.at"
/name\/age/
"name\\/age"
/\d.\d{1,2}/
"\\d.\\d{1,2}"
/\w\\helllo\\123/
"\\w\\\\hello\\\\123"
설명: ECMAScript 3 는 글자 수 를 사용 할 때 RegExp 인 스 턴 스 를 공유 합 니 다. new RegExp (pattern, flags) 를 사용 하면 정규 표현 식 마다 인 스 턴 스 를 만 듭 니 다. ECMAScript 5 는 매번 새로운 인 스 턴 스 를 만 듭 니 다.
2. 인 스 턴 스 속성
(1) global: 불 값 은 g 표 지 를 설 치 했 는 지 여 부 를 나타 낸다.
(2) ignoreCase: 불 값 은 i 플래그 가 설정 되 어 있 는 지 여 부 를 표시 합 니 다.
(3) multiline: 불 값 은 m 표 지 를 설 치 했 는 지 여 부 를 나타 낸다.
(4) lastIndex: 정 수 는 다음 일치 하 는 항목 의 문자 위 치 를 검색 하기 시작 하 는 것 을 나타 내 며 0 부터 계산 합 니 다.
(5) source: 문자열 은 글자 의 양 에 따라 만 든 문자열 모드 를 표시 합 니 다. 인 스 턴 스 가 구조 함 수 를 사용 하여 만 들 더 라 도 글자 의 양 형식의 문자열 모드 를 저장 합 니 다.
3. 실례 방법
(1) exec 방법
A. 하나의 인자, 즉 패턴 의 문자열 을 사용 하여 첫 번 째 일치 하 는 항목 의 정 보 를 되 돌려 주 는 배열 입 니 다. 일치 하지 않 을 때 null 을 되 돌려 줍 니 다.
B. 돌아 오 는 배열 은 Array 인 스 턴 스 이지 만 input 와 index 속성 을 추가 로 보호 합 니 다. 각각 정규 표현 식 을 사용 하 는 문자열 과 일치 하 는 항목 이 문자열 에 있 는 위 치 를 표시 합 니 다.
C. 일치 할 때 되 돌아 오 는 배열 에서 첫 번 째 항목 은 전체 패턴 과 일치 하 는 문자열 이 고 다른 항목 은 패턴 의 그룹 과 일치 하 는 문자열 입 니 다.
D. exec () 에 대해 g 를 설정 하 더 라 도 매번 되 돌아 오 는 것 은 일치 하 는 항목 입 니 다. 다른 것 은 g 을 설정 하고 여러 번 exec 를 호출 하 는 시작 위치 가 다 르 며 g 를 설정 하지 않 고 매번 검색 을 시작 합 니 다.
2. test () 방법
문자열 인 자 를 받 아들 입 니 다. true 로 돌아 가 는 것 과 일치 하지 않 습 니 다. false 로 돌아 가 는 것 과 일치 하지 않 습 니 다.
3. cordova / utils 에서 vformat 방법 분석
위의 기초 가 있 으 면 vformat 의 소스 코드 를 다시 보고 코드 주석 에 상세 하 게 설명 합 니 다.
 1 utils.vformat = function(formatString, args) {
 2     if (formatString === null || formatString === undefined) return "";//    null undefined ,        
 3     if (arguments.length == 1) return formatString.toString();//  args   ,             
 4     if (typeof formatString != "string") return formatString.toString();//
 5     /*
 6     *    1.  ,            ,      ,          。
 7     *    2.  ,       ,   (.*?)、(.) (.*)
 8     *        2.1          ,          
 9     *        2.2         (    )       (    0 )    
10     *        2.3         (    )       (    0 )    
11     */
12     var pattern = /(.*?)%(.)(.*)/;
13     var rest    = formatString;
14     var result  = [];//    
15 
16     while (args.length) {//    ,     ,args     ,  args.length 0,            ,            
17         var arg   = args.shift();//        ,       ,      
18     /*
19     *          ,             ,      null
20     *    match[0]        
21     *    match[1]            , %     
22     *    match[2]            , %        
23     *    match[3]            , %             ,             
24     */
25         var match = pattern.exec(rest);
26         if (!match) break;//
27         rest = match[3];
28         result.push(match[1]);
29         if (match[2] == '%') {//   %% ,        %,           ,        
30             result.push('%');
31             args.unshift(arg);//       
32             continue;
33         }
34         result.push(formatted(arg, match[2]));// %        ,      
35     }
36     result.push(rest);//              
37     return result.join('');//             
38 };

덧 붙 여, 첫 번 째 그룹 은 왜 게 으 름 모드 를 사용 합 니까? 게 으 름 모드 를 사용 하지 않 는 다 고 가정 하면...% j..% o... 첫 번 째 순환 은 뒤의% o 와 일치 합 니 다. g 로고 가 설정 되 어 있 지 않 고 첫 번 째 로 만 나타 나 는 것 이 아니 냐 고 물 을 수도 있 습 니 다. g 설정 이 없 으 면 첫 번 째 로 만 나타 나 는 것 이 맞 습 니 다. 하지만 게 으 름 모드 (. *) 가 아니라면...% j.....................................................................................

좋은 웹페이지 즐겨찾기