目录
1、定义正则表达式
2、访问正则表达式对象
3、执行匹配操作的方法
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码,它是 字符串执行模式匹配 的强大工具,在 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个修饰调分别指定了匹配操作的范围、大小写和多行行为,关键词可以自由组合
每个正则表达式都是一个对象,继承于 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
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"等。