JavaScript 正则表达式操作基础

目录

1、定义正则表达式

2、访问正则表达式对象

3、执行匹配操作的方法


1、定义正则表达式

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码,它是 字符串执行模式匹配 的强大工具,在 Web 应用中占据重要位置。定义正则表达式的方法包括:构造法直接量

1.1、构造正则表达式

RegExp 构造函数可以定义正则表达式对象,用法如下:

new RegExp(pattern,attributes)
//参数pattern是一个字符串,指定了正则表达式的模式或者其他正则表达式
//参数attributes是一个可选的修饰性标志,包含“g”、“i”和“m”,分别用于指定全局匹配、区分大小写的匹配和多行匹配。
//    如果patten是正则表达式,而不是字符串,则必须省略该参数。
//该函数将返回一个新的RegExp对象,具有指定的模式和标志。

下面例子使用 RegExp 构造函数定义了一个简单的正则表达式,匹配模式为字符 "a",没有设置第2个参数,所以这个正则表达式只能够匹配字符串中第1个小写字母a,后面的字母a将无法被匹配到。

var r = new RegExp("a");    //构造最简单的正则表达式
var s = "javascript!=JAVA"; //定义字符串直接量
var a = s.match(r);         //调用正则表达式执行匹配操作,返回匹配的数组
alert(a);          //返回数组["a"]
alert(a,index);    //返回值为1

如果希望匹配字符串中所有的字母 a,且不区分大小写,则可以在第 2 个参数中增加 g i 修饰词。

var r = new RegExp("a","gi");    //构造最简单的正则表达式
var s = "javascript!=JAVA";  //定义字符串直接量
var a = s.match(r);          //调用正则表达式执行匹配操作,返回匹配的数组
alert(a);          //返回数组["a","a","A","A"]

在正则表达式中可以使用特殊字符。下面例子的正则表达式将匹配字符串"javascript JAVA"中每个单词的首字母。

var r = new RegExp("\\b\\w","gi");    //构造正则表达式对象
var s = "javascript JAVA";  //定义字符串直接量
var a = s.match(r);          //调用正则表达式执行匹配操作,返回匹配的数组
alert(a);          //返回数组["j","J"]

在上面示例中,字符串 "\\b\\w" 表示一个匹配模式,其中 "\b" 表示单词的边界,"\w" 表示任意ASCⅡ字符,反斜杠表示转义序列,为了避免 Regular() 构造函数的误解,必须使用 "\\" 替换所有 "\" 字符,使用双反斜杠表示斜杠本身的意思。

1.2、正则表达式直接量

正则表达式直接量使用双斜杠 // 作为分隔符进行定义,双斜杠之间包含的字符为正则表达式的字符模式,字符模式不能使用引号,标志字符放在最后一个斜杠的后面。语法如下:

/pattern/attributes

下面例子定义一个正则表达式直接量,然后进行调用。

vax r = /\b\w/gi;
var a = "javascript JAVA";
var a = s.match(r);    //直接调用正期表达式直按量
alert(a);    //返回数组["j","J"]

在 RegExp() 构造高数与正则表达式直接量语法中,匹都模式的表示是不同的。对于 RegExp() 构造函数来说,它接收的是字符串,而不是正则表达式的匹配模式。所以,在上面示例中,RegExp() 构造函数中第1个参数中的特殊字符必须使用双反斜杠来表示,以防止字得串中每个字符被 RegExp() 构造函数转义。同时对于第2个参数中的修饰词也应该使用引号来包含。而正则表达式直接量中,每个字得都按正则表达式的规则来定义,普通字符与特殊字符都会被正确解释。

JavaScript 正则表达式支持 "g"、"i" 和 "m" 3 个标志修饰符。简单说明如下。

"g":global(全局)的缩写,定义全局匹配,即正则表达式将在指定字符串范围内执行所有匹配,而不是找到第一个匹配结果后就停止匹配
"i":case-insensitive(不区分大小写)中insensitive的缩写,定义不区分大小写匹配,即对于字母大小写视为等同
"m":multiline(多行)的缩写,定义多行字符串匹配
这3个修饰调分别指定了匹配操作的范围、大小写和多行行为,关键词可以自由组合

2、访问正则表达式对象

每个正则表达式都是一个对象,继承于 RegExp 类型。RegExp 对象包含多个属性:

属性说明
global

只读属性,返回Boolean值,检测RegExp对象是否具有标志 g

ignoreCase

只读属性,返回Boolean值,检测RegExp对象是否具有标志 i

multiline只读属性,返网Boolean值,检测RegExp对象是否具有标志 m
lastIndex一个整数,返回或者设置开始执行下一次匹配的字符位置
source只读属性,返回正则表达式的源字符串文本

下面例子演示了如何读取正则表达式对象的基本信息。

var r = /a/gi;       //声明正则表达式直接量
alert(r.global);     //返回true
alert(x.ignoreCase); //返回true
alert(r.multiline);  //返回false
alert(r.source);     //返回a

lastIndex 属性比较有用,对于具有标志 g 的匹配模式来说,该属性存储了在字符串中下一次开始检索的位置。下面示例演示了 exec() 方法如何配合 lastlndex 属性实现全局检索。

var s = "javascript is not java";
var r = /a/gi;        //正则表达式直接量
r.exec(s);            //第一次执行匹配
alert(r.lastIndex);   //返回值为2
r.exec(s);            //第二次执行匹配
alert(r.lastIndex);   //返回值为4
r.exec(s);            //第三次执行匹配
alert(r.lastIndex);   //返回值为20
r.exec(s);            //第四次执行匹配
alert(r.lastIndex);   //返回值为22
r.exec(s);            //第五次执行匹配
alert(r.lastIndex);   //返回值为0

在上面示例中,正则表达式 r 查找字母 a。当它首次检测时,发现在第2个位置(序号为1)有一个字母a,于是 lastIndex 属性就被设置为2,记录开始下一次匹配时的起始位置。当再次调用 exec() 方法时,就会从 lastindex 属性指定的位置开始匹配,依此类推。

可以手动改变 lastIndex 属性值,强迫正则表达式从指定的位置开始执行检测。

var s ="0123456789";
var r = /\d/g;        //匹配单个数字
r.lastIndex = 5;      //指定匹配起始位置为5,即从第6个字符开始匹配
var a = r.exec(s);    //执行匹配
alert(a);             //返回匹配数字为5

3、执行匹配操作的方法

RegExp 对象定义了多个方法,如表所示,调用它们可以对字符串执行模式匹配操作。

方法说明
exec()检索字符串中指定的值,返回找到的值,并确定其位置
test()检索字符中中指定的值,返回 true 或 false
compile()编译正则表达式

作为正则表达式的通用匹配方法,exec() 方法功能最强大。用法如下:

RegExpObject.exec(string);
//参数string是要检索的字符串。返回一个数组,其中存放匹配的结果。如果未找到匹配结果,则返回null。
//返回数组的第0个元素是与正则表达式相匹配的文本,第1个元素是与RegExpObject的第1个子表达式相匹配的文本(如果有的话),
//    第2个元素是与RegExpObject的第2个子表达式相匹配的文本(如果有的话),以此类推。

除了数组元素和 length 属性之外,exec() 方法还返回如下两个属性。

index:匹配文本的第一个字符的位置。
input:存放被检索的字符串(string)。

在调用非全局模式的 RegExp 对象的 exec() 方法时,返回的数组与调用 String.match() 方法返回的数组是相同的。

在调用非全局模式的 RegExp 对象的 exec() 方法时,RegExpObject 的 lastIndex 属性指定执行匹配的起始位置,当 exec() 方法找到了与表达式相匹配的文本后,将把 lastIndex 设置为匹配文本的最后一个字符的下一个位置。这样用户可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本,当 exec() 再也找不到匹配的文本时,将返回null,并把 lastindex属性重置为 0。在下面例子中,定义正则表达式来匹配字符串中每个字符,通过循环调用 exec() 方法获得完整匹配信息。

var a ="javascript"; //测试使用的字符串直接年
var x = /\w/g;       //匹配模式
while((a = r.exec(s)) != null){    //循环执行匹配操作
    alert(a[0]+"\n"+a.index +"n"+r.lastIndex);    //显示每次匹配操作是返回的结果数组信息
}

在 while语句中,根据匹配结果的值是否为null作为循环条件,当返回值为null时,说明字符串检测完毕,停止选代、否则继续执行。在循环体内,读取返回数组a中包含的匹配结果,并调用该数组的 index 和 lastIndex 属性,其中index显示当前匹配子字符串的起始位置,而lastlndex属性显示下一次匹配操作的起始位置。

无论是否为全局模式,exec() 方法都会把完整的细节添加到返回数组中,而String.mach() 在全局模式下适园的信息要少得多。因此在循环中反复调用exec() 方法是唯一一种获得全局模式的完整模式匹配信息的方法。

注意:如果在一个字符串中完成了一次模式匹配之后,再开始检索新的字符串,就必须手动把正则表达式对象的 lastIndex 属性重置为0。

test() 方法能够检测一个字符串是否符合指定匹配模式,改方法事宜作为条件检测使用,用法如下:

RegExeObject.test(string);
//参数string表示要检测的字符串,如果字符串string中含有与RegExpObject匹配的文本,则返回true,否则返回false

compile() 方法用于在脚本执行过程中改变或重新编译正则表达式,即更换正则表达式对象所使用的匹配模式。用法如下:

RegExeObject.compile(regexp,modifier);
//参数regexp表示正则表达式,modifier定义匹配的类型,如"g"、"i"、"m"等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值