ECMAScript正则表达式

正则表达式主要用于查询、检索或替换所有符合某个模式(规则)的文本。因此正则表达式其实就是一种文本模式,这种模式用于描述在搜索文本时要匹配的一个或多个字符串。

一般来讲,正则表达式是由普通字符(a~z,A~Z等)、数字(0~9)以及一些特殊字符(”\”,”|”,”*”,”^”,”$”,”?”,”!”等)组合而成的一种逻辑公式,其表示具有一定规则的字符串,并通过规则来达到过滤文本的目的。在ECMAScript语法规范中,正则表达式是以一个RegRxp对象来实现的。

三种定义 RegRxp对象 的方式:

1、var abc=new RegExp(pattern,attributes);
pattern可以是正则表达式或者是字符串,pattern是正则表达式时,attributes参数需要省略
2、var abc= RegExp(pattern,attributes);
3、var abc=/pattern/arributes

test(),exec(),complie()三个函数的使用方法

test():检测一个字符串是否匹配某个模式,并根据检索结果返回一个布尔值
var strtxt="Hello EcmaScript!";
var reg1=new RegExp("EcmaScript");
var result1=reg1.test(strtxt);

则result1得到true

exec(): 检测一个字符串是否匹配某个模式,并根据检索结果返回检索到的内容
var strtxt="Hello EcmaScript!";
var reg2=new RegExp("EcmaScript");
var result2=reg2.exec(strtxt);

则 result2 得到 “EcmaScript”

compile(): 用于在脚本执行过程中编译正则表达式,也可以用于改变和重新编译正则表达式
var strtxt="Hello EcmaScript!";
var reg3=new RegExp("EcmaScript");
reg3.compile(" ecmaScript ");
var result3=reg3.exec(strtxt);

则result3得到false

RegExp对象修饰符标记

“g”修饰符标记用于定义正则表达式对象是否执行全局检索
var strtxt="EcmaScript EcmaScript EcmaScript";
var reg1=/Ecma/;
reg1.exec(strtxt);
var i=reg1.lastIndex;

i为0,lastIndex可得当前检索位置,即默认情况下的exec只会检索出第一个Ecma并返回,然后检索位置重新归0;
var reg2=/Ecma/g;
reg2.exec(strtxt);
var j=reg2.lastIndex;

j为4,即用g修饰时,能全局检索,,检索出第一个Ecma后,检索位置不归零。

“i”修饰符标记用于定义正则表达式对象执行大小写不敏感的检索
var strtxt="Hello EcmaScript!";
reg1=/E/i;
abc=reg1.exec(strtxt);

则abc得到返回值是“e”。

“g”和”i”还可组合起来一起使用。

RegExp对象属性

1、global属性
用于返回正则表达式是否定义了”g”修饰符标记,定义了则返回true,反之,返回false
2、ignoreCase属性
用于返回正则表达式是否定义了”i”修饰符标记,定义了则返回true,反之,返回false
3、lastIndex属性
用于规定下次检索匹配的起始位置,属性默认值为0,表示从第一个字符开始检索,当检索到最后一个字符后,其值为字符串的长度。
4、source属性
返回正则表达式的源文本(不带修饰符标记)

RegExp对象模式

1、方括号
[abc]表示匹配到abc其中一个字符即可
[^abc]表示匹配到任意非abc其中一个字符即可
[A-z]表示匹配到任意英文字母即可(不区分大小写)
[^A-z]表示匹配到任意非英文字母即可
[0-9]表示匹配到数字即可
[78]表示匹配到数字7或8其中一个即可
例:
var strtxt="Hello EcmaScript!";
var reg1=/[abc]/;
var result1=reg1.test(strtxt);

则result1得到返回值true
再例:
var strtxt="HelloEcmaScript";
var reg2=/[^A-z]/;
var result2=reg2.test(strtxt);

则result2得到返回值false

2、元字符
\w,\d,\s,\b,.,\xdd
\w可检索字符和数字,不能检索空格,标点符号等其他字符则返回null
例:
var strtxt ="Hi 123!";
var reg1=/\w/g;
var result;
for (var i=0;i<6;i++)
{
    result=reg1.exec(strtxt);
    console.log(result);
}

可依次输出”H”,”i”,”1″,”2″,”3″,null
\d可以检索数字,但不能检索字母字符,如果是标点符号等其他字符则返回null
例:
var strtxt ="Hi 123!";
var reg1=/\d/g;
var result;
for (var i=0;i<4;i++)
{
    result=reg1.exec(strtxt);
    console.log(result);
}

可依次输出 “1”,”2″,”3″,null
\s可以检索空白字符(即空格),如果是标点符号则返回null
例:
var strtxt ="Hi 123!";
var reg1=/\s/g;
var result;
for (var i=0;i<3;i++)
{
    result=reg1.exec(strtxt);
    console.log(result);
}

依次输出” “,null,” “
\b可检索单词(有空格隔开才算一个完整单词)
例:
var strtxt ="Hi 123!";
var strtxt2 ="Hi123";
var reg1=/Hi\b/g;
var result = reg1.exec(strtxt);
var result2 = reg1.exec(strtxt2);

result能得到返回值Hi,result2只有null
.可代指任意单个字符
例:
var strtxt="Elmo also loops!";
var reg1=/l.o/g;
var result;
for (var i=0;i<3;i++)
{
    result=reg1.exec(strtxt);
    console.log(result);
}

依此能输出lmo,lso,loo
\xdd可代表阿斯克码表上的字符,例\x41为”A”,\x61为”a”,\x38为”8″

3、量词
*,+,?,{x},{x,y},{x,}
*用于匹配0次至多次重复的字符
+用于匹配1次至多次重复的字符
?用于匹配0次或1次重复的字符

例:
var strtxt="H Hi Hii Hiii";
var reg1=/Hi*/g;
var result1;
for (var i =0;i <=3;i++)
{
    result1=reg1.exec(strtxt);
    console.log(result1);
}

则会依次输出”H”,”Hi”,”Hii”,”Hiii”
将*改成+,则会输出 “Hi”,”Hii”,”Hiii”
将*改成?,则会输出 “H”,”Hi”
{x},{x,y},{x,} 用于匹配字符或数字重复出现的固定次数
例:
var strnum= "8 88 888 8888 88888";
var reg1=/8{1}/g;
var result2;
for (var i =0;i <=5;i++)
{
    result2=reg1.exec(strnum);
    console.log(result2);
}

则会依次输出”8″,”8″,”8″,”8″,”8″
若将{1}改为{3},i<=5改为i<=3,则会依次输出”888″,”888″,”888″
若将{1}改为{2,4},i<=5改为i<=3 ,则会依次输出”88″,”888″,”8888″
若将{1}改为{2,},i<=5改为i<=4,则会依次输出”88″,”888″,”8888″,”88888″
^和$还可匹配整个字符串的开头和结尾
var strtxt="Hi Hii Hiii";
var reg3=/^Hi/g;
result3=reg3.exec(strtxt);

则result3可得到返回值Hi, 换成/^Hii/g则只会返回null
(用$时放在后面,如var reg4=/Hiii$/g)

var reg4=/\d{4}-\d{2}-\d{2}|\d{8}/;可查找格式为2019-04-06或者20190406的日期

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注