正则对象
正则表达式基础
-
正则表达式(regular expression)用来按照“给定模式”匹配文本。
-
比如,正则表达式给出一个 Email 地址的模式,然后用它来确定一个字符串是否为 Email 地址。
-
用来匹配时间,用户名格式,手机号的长度等等
-
新建正则表达式有两种方法。
- 一种是使用字面量,以斜杠表示开始和结束
/*验证字符串里面是否有xyz*/
var regex = /xyz/;
- 另一种是使用RegExp构造函数,也就是new
var regex = new RegExp('xyz');
正则执行方法
- 正则的执行的方法主要有两种,一种是*
test()方法,另一种是exec()*方法
test()
- 正则对象的test方法返回一个布尔值,表示当前模式是否能匹配参数字符串
/it/.test('itbaizhan') // true
- 如果正则模式是一个空字符串,则匹配所有字符串
new RegExp('').test('abc')
exec()
正则对象的exec方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null。
var reg1 = /it/;
var name ="itbaizhan";/* 字符串形式 */
var result1 = reg1.test(name);
var result2 = reg1.exec(name);
console.log(result1);
console.log(result2);
0:代表正则匹配的内容
indedx:代表从哪个地址开始匹配
input:代表需匹配的原字符串
字符串方法
- 字符串方法之中,有4种与正则表达式有关
- String.prototype.match() 返回一个数组,成员是所有匹配的子字符串
- String.prototype.search() 按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置
- String.prototype.replace() 按照给定的正则表达式进行替换,返回替换后的字符串
- String.prototype.split() 按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员
String.prototype.match()
- 字符串实例对象的match方法对字符串进行正则匹配,返回匹配结果
- 跟exec相似
var str = 'itbaizhan';
var reg1 = /baizhan/;
var reg2 = /sxt/;
console.log(str.match(reg1));
console.log(str.match(reg2));
String.prototype.search()
- 字符串对象的search方法,返回第一个满足条件的匹配结果在整个字符串中的位置。
- 如果没有任何匹配,则返回*-1*。
"itbaizhan".search(/it/); // 0
String.prototype.replace()
- 字符串对象的replace方法可以替换匹配的值。
- 它接受两个参数,第一个是正则表达式,表示搜索模式,第二个是替换的内容
"itbaizhan".replace(/it/,"sxt")
String.prototype.split()
- 字符串对象的split方法按照正则规则分割字符串,返回一个由分割后的各个部分组成的数组。
- 该方法接受两个参数,第一个参数是正则表达式,表示分隔规则,第二个参数是返回数组的最大成员数。
"it,sxt,itbaizhan".split(/,/) /* ['it', 'sxt', 'itbaizhan'] */
"it,sxt,itbaizhan".split(/,/,2) /* ['it', 'sxt'] */ /*数组只剩下2个元素*/
匹配规则之字面量字符和元字符
字面量字符
- 大部分字符在正则表达式中,就是字面的含义,比如/a/匹配a,/b/匹配b。
- 如果在正则表达式之中,某个字符只表示它字面的含义(就像前面的a和b),那么它们就叫做“字面量字符”
/it/.test('itbaizhan')
元字符
除了字面量字符以外,还有一部分字符有特殊含义,不代表字面的意思。它们叫做“元字符”(metacharacters),主要有以下几个
- 点字符(.)
- 位置字符
- 选择符(|)
点字符(.)
点字符(.)匹配除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
/c.t/
var reg =/s.t/
console.log(reg.test("sxt"));/* true */
console.log(reg.test("sxxt"));/* false */
c.t匹配c和t之间包含任意一个字符的情况,只要这三个字符在同一行,比如cat、c2t、c-t等等,但是不匹配coot
位置字符
位置字符用来提示字符所处的位置,主要有两个字符
- ^ 表示字符串的开始位置
- $ 表示字符串的结束位置
/^it/.test('itbaizhan');/*开始位置*/
/it$/.test('learn it');/*结束位置*/
/^it$/.test('it');/*必须完全符合*/
var reg1 = /^it/;/* 必须在开始位置 */
console.log(reg1.test("itbaizhan"));/* true */
console.log(reg1.test("helloitbaizhan"));/* false */
var reg2 = /it$/;/* 必须在结束位置 */
console.log(reg2.test("baizhanit"));/* true */
console.log(reg2.test("helloitbaizhan"));/* false */
var reg3 = /^it$/;/* 必须在结束位置 */
console.log(reg3.test("it"));/* true */
console.log(reg3.test("itbaizhanit"));/* false */
选择符(|)
竖线符号(|)在正则表达式中表示“或关系”(OR),即cat|dog表示匹配cat或dog
/it|sxt/.test('itbaizhan');
/it|sxt/.test('sxtbaizhan');
var reg4 = /cat|dog/;/* 或者 */
console.log(reg4.test("cathello"));/* true */
console.log(reg4.test("doghello"));/* true */
匹配规则之转义符
- 正则表达式中那些有特殊含义的元字符,如果要匹配它们本身,就需要在它们前面要加上反斜杠。
- 比如要匹配+,就要写成
+,加号在正则中又特殊意义
/1+1/.test('1+1'); // false
/1+1/.test('1+1'); // true
正则表达式中,需要反斜杠转义的,一共有12个字符:^、.、[、$、(、)、|、*、+、?、{和\
温馨提示
使用new 关键字生成正则对象,转义需要使用两个斜杠,因为字符串内部会先转义一次
var reg1 = new RegExp('1+1').test('1+1')
// false
var reg2 = new RegExp('1\+1').test('1+1')
// true
匹配规则之字符类
- 字符类表示有一系列字符可供选择,只要匹配其中一个就可以了。
- 所有可供选择的字符都放在方括号内
- 比如
[xyz]表示x、y、z之中任选一个匹配
/[abc]/.test('hello world'); // false
/[abc]/.test('apple'); // true
-
字符类分为两类
- 脱字符(^)
- 连字符(-)
脱字符(^)
- 如果方括号内的第一个字符是[^],则表示除了字符类之中的字符,其他字符都可以匹配。
- 比如,
[^xyz]表示除了x、y、z之外都可以匹配 - 也就是取反的意思
/[^abc]/.test('sxt'); // true 完全不包含
/[^abc]/.test('apple'); // true 不完全包含
/[^abc]/.test('abcpple'); // true 完全包含(+其他字母)
/[^abc]/.test('abc'); // false 完全包含(一模一样,只有abc组成)
/[^abc]/.test('aabbcc'); // false 完全包含(只有abc组成)
温馨提示
/[^abc]/.test('aabbcc')内容必须全部都为abc才是false,否则为true
连字符(-)
- 某些情况下,对于连续序列的字符,连字符(-)用来提供简写形式,表示字符的连续范围。
- 比如, [abc]可以写成[a-c] ,
- [0123456789] 可以写成 [0-9] ,
- [A-Z]表示26个大写字母
- [a-z]表示26个小写字母
/a-z/.test('b'); // false
/[a-z]/.test('b'); // true
以下都是合法的字符类简写形式
[0-9.,]/*0-9 还有.和,都要匹配*/
[0-9a-fA-F]
[a-zA-Z0-9-] /*a-z,A-Z,0-9,还有一个“-”*/
[1-31]/*1,2,3*/