1.RegExp类型
1.1基础介绍
ECMAScript通过RegExp类型来支持正则表达式,使用下面类似Perl的语法,jiuk就可以创建一个正则biao表达式。对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
var expression = / pattern /flags ;
其中的模式(pattern)部分可以是简单或复杂的正则表达式,可以包含字符类、限字符、分组、向前查找及反向引用。每个正则表达式都可以带有一或多个标志(flags),用以标明正则表达式的行为。正则表达式的匹配模式支持下列三个标志。
- g:表示全局模式,即模式将被引用于所有的字符串,而非在faxi发现第一个匹配项时立即停止;
- i:表示不区分大小写模式,即在匹配项时忽略模式与字符串的大小写;
- m:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
因此,一个正则表达式就是一个模式与上述三个标志的组合体。
1.2实例化
有两种方法实例化RegExp对象
字面量
var reg = /\bis\b/g
构造函数
var reg = new RegExp('\\bis\\b','g')
1.3元字符介绍
- "^":^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置。
- "$":$会匹配行或字符串的结尾。
- "\b":不会消耗任何字符只匹配一个位置,常用于匹配单词边界 如:我想从字符串中"This is Regex"匹配单独的单词 "is" 正则就要写成:
"This is Regex".match(/\bis\b/);
"\b" 不会匹配is 两边的字符,但它会识别is 两边是否为单词的边界。 - "\d":匹配数字。
- "\w":匹配字母,数字,下划线。等价于'[A-Za-z0-9_]'。
- "\s":匹配空格。
- ".":匹配除了回车符换行符以外的任何字符。
- "[a-zA-Z]":字符组 匹配包含括号内元素的字符。
-
几种反义:改成大写,意思就与原来的相反。
如:
"\W":匹配任何非单词字符。等价于'[^A-Za-z0-9_]'。
"[^abc]":匹配除了abc以外的任意字符。 -
字符转义:在正则表达式中元字符是有特殊的含义的,当我们要匹配元字符本身时,就需要用到字符转义,如:
/\./.test("."); // true
1.4字符类
一般情况下正则表达式一个字符对应字符串一个字符
表达式ab\t的含义是匹配ab
1.4.1字符类的使用:
- 我们可以使用元字符[]来构建一个简单的类
- 所谓类是指符合某些特性的对象,一个泛指,而不是特指某个字符
- 表达式[abc]把字符a或b或c归为一类,表达式可以匹配这类的字符
1.4.2字符类取反
- 使用元字符^创建 反响类/fuxi负向类
- 反向类的意思是不属于某类的内容
- 表达式[^abc]表示 不是字符a或b或c的内容
1.5范围类
使用字符类匹配数字
- 正则表达式还提供了范围类
- 所以我们可以使用[a-z]来连接两个字符表示从a到z的任意字符
- 这是一个闭区间,包含a和z本身
- 在[]组成的类内部是可以连写的[a-zA-Z]
1.6边界匹配字符
"^":^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置。
"$":$会匹配行或字符串的结尾。
"\b":不会消耗任何字符只匹配一个位置,常用于匹配单词边界 如:我想从字符串中"This is Regex"匹配单独的单词 "is" 正则就要写成:"This is Regex".match(/\bis\b/);
"\b" 不会匹配is 两边的字符,但它会识别is 两边是否为单词的边界。
"\B":非单词边界。
1.7量词
我们希望匹配一个连续出现多次数字的字符串
贪婪模式:在有的情况下尽可能多的去匹配。
非贪婪模式:让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试就是非贪婪模式。做法很简单,在量词后加入?即可:
如'123456789'.match(/\d{3,5}?/g)
1.8分组
匹配字符串Byron连续出现3次的场景,Byron{3}匹配的是n出现3次
- 使用()可以达到分组的功能,使量词作用于分组(Byron){3}
1.9或
使用|可以达到或的效果:Byron|Casper,Byr(on|Ca)sper
1.10反向引用
'2015-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2$3$1')
属性$1~$9 如果它(们)存在,用于得到对应分组中匹配到的子串
\1或$1 用于匹配第一个分组中的内容
\2或$2 用于匹配第一个分组中的内容
...
\9或$9 用于匹配第一个分组中的内容
1.11忽略分组
不希望捕获某些分组,只需要在分组加上?:就可以
(?:Byron).(ok)
1.12前瞻
- 正则表达式从文本头部向尾部开始解析,文本尾部方向,称为“前”。
- 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾/后瞻方向相反
- javascript不支持后顾
- 符合和不符合特定断言称为肯定/正向匹配和否定/负向匹配
正向前瞻用来检查接下来的出现的是不是某个特定的字符集。而负向前瞻则是检查接下来的不应该出现的特定字符串集。零宽断言是不会被捕获的。不过javascript不支持后瞻
1.13test和exec和search方法
1.正则表达式test方法
test() 方法用于检测一个字符串是否匹配某个模式
返回值:
如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回false。
2、正则表达式exec方法
exec() 方法用于检索字符串中的正则表达式的匹配。
返回值:返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
3、字符串search方法
search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
返回值:stringObject 中第一个与 regexp 相匹配的子串的起始位置。
4、示例代码:
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <title>JavaScript中字符串的match与replace方法</title> </head> <body> <script type="text/javascript"> var str = "Visit W3School W3School!" //控制台输出6 console.log(str.search(/W3School/)); var reg = new RegExp("W3School"); //控制台输出true 表示如果字符串 中含有与正则表达式匹配的文本 console.log(reg.test(str)); //控制台输出:"W3School", index: 6, input: "Visit W3School W3School!" //第一个"W3School"表示与正则表达式相匹配的文本 //第二个index: 6表示匹配文本的第一个字符的位置 //第三个input: "VVisit W3School W3School!"表示存放的是被检索的字符串 string console.log(reg.exec(str)); </script> </body> </html>
说明:正则表达式的exec使用比较复杂,正则表达式的test方法和字符串的search方法比较简洁。