>웹 프론트엔드 >JS 튜토리얼 >JavaScript 고급 프로그래밍(3판) 학습 노트 12 js 정규식_기본 지식

JavaScript 고급 프로그래밍(3판) 학습 노트 12 js 정규식_기본 지식

WBOY
WBOY원래의
2016-05-16 17:49:181042검색

需要指出的是,这里只是总结了正则表达式的常用的且比较简单的语法,而不是全部语法,在我看来,掌握了这些常用语法,已经足够应对日常应用了。正则表达式不只是应用在ECMAScript中,在JAVA、.Net、Unix等也有相应应用,这篇文章则是以ECMAScript中的正则表达式为基础总结的。

一、正则表达式基础

1、普通字符:字母、数字、下划线、汉字以及所有没有特殊意义的字符,如ABC123。在匹配时,匹配与之相同的字符。

2、特殊字符:(需要时,使用反斜杠“”进行转义)

字符 含义 字符 含义 字符 含义 字符 含义
\a 响铃符 = \x07 ^ 匹配字符串的开始位置 \b 匹配单词的开始或结束 {n} 匹配n次
\f 换页符 = \x0C $ 匹配字符串的结束位置 \B 匹配不是单词开始和结束的位置 {n,} 匹配至少n次
\n 换行符 = \x0A () 标记一个子表达式的开始和结束 \d 匹配数字 {n,m} 匹配n到m次
\r 回车符 = \x0D [] 自定义字符组合匹配 \D 匹配任意不是数字的字符 [0-9] 匹配0到9中任意一个数字
\t 制表符 = \x09 {} 修饰匹配次数的符号 \s 匹配任意空白字符 [f-m] 匹配f到m中任意一个字母
\v 垂直制表符 = \x0B . 匹配除换行符外的字符 \S 匹配任意非空白字符    
\e ESC符 = \x1B ? 匹配0或1次 \w 匹配字母或数字或下划线或汉字    
\xXX 使用两位十六进制表示形式,可与该编号的字符匹配 + 匹配1或多次 \W 匹配任意不是字母、数字、下划线和汉字的字符    
\uXXXX 用四位十六进制表示形式,可与该编号的字符匹配 * 匹配0或多次 [^x] 匹配除x外的所有字符    
\x{XXXXXX} 使用任意位十六进制表示形式,可与该编号的字符匹配 | 左右两边表达式之间“或”关系 [^aeiou] 匹配除aeiou外的所有字符    

上面列举的这些特殊字符,可以大致的分为: 

(1)不便书写字符:如响铃符(a)、换页符(f)、换行符( )、回车符( )、制表符( )、ESC符(\e)

(2)十六进制字符:如两位(\x02)、四位(\x012B)、任意位(x{A34D1})

(3)表示位置字符:如字符串开始(^)、字符串结束($)、单词开始和结束()、单词中间(\B)

(4)表示次数字符:如0或1次(?)、1或多次(+)、0或多次(*)、n次({n})、至少n次({n,})、n到m次({n,m})

(5)修饰字符:如修饰次数({})、自定义组合匹配([])、子表达式(())

(6)反义字符:

  (A)通过大小写反义:如和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的话,会匹配linjison,而不是 lin,这种模式也就是正则表达式的贪婪模式;相对应的,可以通过添加字符“?”来设置为懒惰模式,也即尽可能匹配更少字符。如*?表示重复0次或多次, 但尽可能少重复。

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분 정규식 입문 튜토리얼을 참조하세요. Javascript의 정규식 구현에 대해 알아봅시다.

2. Javascript의 정규식 객체 RegExp

1. 정규식 만들기

(1) 리터럴 사용: 구문 var exp = /pattern/flags;

A. 패턴은 정규식입니다

B. 세 가지 유형의 플래그가 있습니다. g는 전역 모드, i는 대소문자 무시, m은 여러 줄 모드를 의미합니다.

(2) RegExp 내장 생성자 사용: 구문 var exp = new RegExp(pattern, flags);

A. 생성자를 사용할 때 패턴과 플래그가 모두 문자열 형식이므로 이스케이프 문자에 이중 이스케이프가 필요합니다. 예:

字面量 构造函数
/[bc]at/ "\[bc\]at"
/.at/ "\.at"
/name/age/ "name\/age"
/d.d{1,2}/ "\d.\d{1,2}"
/w\helllo3/ "\w\hello\123"

참고: ECMAScript 3은 리터럴을 사용할 때 RegExp 인스턴스를 공유합니다. new RegExp(pattern, flags)를 사용하면 각 정규 표현식에 대한 인스턴스가 생성됩니다. ECMAScript 5에서는 매번 새 인스턴스가 생성되도록 규정합니다.

2. 인스턴스 속성

(1) 전역: g 플래그가 설정되었는지 여부를 나타내는 부울 값입니다.

(2)ignoreCase: i 플래그가 설정되었는지 여부를 나타내는 부울 값입니다.

(3) 여러 줄: m 플래그가 설정되었는지 여부를 나타내는 부울 값입니다.

(4) lastIndex: 정수, 0부터 시작하여 다음 일치 항목 검색을 시작할 문자 위치를 나타냅니다.

(5) 소스: 문자열, 리터럴 형식으로 생성된 문자열 패턴을 나타냅니다. 생성자를 사용하여 인스턴스를 생성하더라도 문자열 패턴은 리터럴 형식으로 저장됩니다.

3.인스턴스 방식

(1)exec() 메소드

A. 하나의 매개변수는 패턴이 적용될 문자열이며, 일치하는 첫 번째 항목 정보의 배열을 반환합니다. 일치하는 항목이 없으면 null이 반환됩니다.

B. 반환된 배열은 Array 인스턴스이지만 정규식이 적용되는 문자열과 문자열에서 일치하는 항목의 위치를 ​​각각 나타내는 입력 및 인덱스 속성도 있습니다.

C. 일치 시 반환된 배열에서 첫 번째 항목은 전체 패턴과 일치하는 문자열이고, 나머지 항목은 패턴 내 그룹과 일치하는 문자열입니다. (그룹화가 없으면 반환된 배열은 1개 항목) .

D. exec()의 경우 g가 설정되어 있어도 매번 일치하는 항목이 반환됩니다. 차이점은 g를 설정하면 exec를 여러 번 호출하는 시작 검색 위치가 다르다는 것입니다. 검색 시작에서 돌아올 때마다.

(2) test() 메소드

문자열 매개변수를 허용하고, 일치하면 true를 반환하고, 일치하지 않으면 false를 반환합니다.

3. 예시분석

PhoneGap 소스 코드에서 서식 지정에 사용되는 정규식을 살펴보겠습니다

코드 복사 코드는 다음과 같습니다.

var 패턴 = /(.*?)%(.)(.*)/
var str = 'lin%%jisong'
var match = Pattern.exec (str);
console.info(match.join(','));//lin%%jisong,lin,%,jisong

var Pattern2 = /(.*) %(. )(.*)/;
var match2 = Pattern2.exec(str)
console.info(match2.join(','));//lin%%jisong,lin%, j,isong


분석: 여기서는 패턴과 패턴2 모두 세 개의 그룹을 포함하고, 두 번째와 세 번째 그룹은 동일하며, 두 번째 그룹(.)은 개행 문자가 아닌 모든 문자와 일치하고, 세 번째 그룹은 그룹(.*)은 가능한 많은 개행 문자가 아닌 문자와 일치하고(탐욕 모드), 패턴의 첫 번째 그룹(.*?)은 개행이 아닌 문자와 가능한 한 적은 수(지연 모드)와 일치하며, 패턴2의 첫 번째 그룹은 그룹(.*)은 개행이 아닌 문자를 최대한 많이 일치시킵니다(탐욕 모드). 따라서 전체 패턴이 성공적으로 일치한다는 것을 전제로(따라서 정규식에서 % 일치를 위해 % 문자를 예약해야 함) 패턴의 첫 번째 그룹은 lin과 일치하고 패턴 2의 첫 번째 그룹은 lin과 일치합니다. %, 위 예의 출력을 분석해 보면 이해하기 어렵지 않습니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.