JavaScript正则表达式的模式匹配

时间:2022-02-02 05:31:45

      正则表达式是一个描述字符模式的对象。JavaScript的RegExp类表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替换功能。

     JavaScript中的正则表达式用RegExp对象表示,可以使用RegExp()构造函数来创建RegExp对象,不过RegExp对象更多的是通过一种特殊的直接量语法来创建。正则表达式直接量定义为包含在一对斜杠(/)之间的字符,如:

     var pattern=/s$/;

     运行这段代码创建一个新的RegExp对象,并将它赋值给变量pattern。这个特殊的RegExp对象用来匹配所有以字母“s”结尾的字符串。用构造函数RegExp()也可以定义一个与之等价的正则表达式,代码如下:

    var pattern = new RegExp("s$");

    ECMAScript 3规范规定,一个正则表达式直接量会在执行到它时转换为一个RegExp对象,同一段代码所表示正则表达式直接量的每次运算都返回同一个对象。

1 直接量字符

      在正则表达式中可以使用本身来表示字符,例如所有的字母和数都是按照字面意思进行匹配的,但是也并非完全如此,例如换行符、回车符这些只能够使用转义字符表示,也就是以反斜杠(\)为前缀进行转义,例如\n表示换行符、\t表示制表符等等。

正则表达式中直接量列表如下:
JavaScript正则表达式的模式匹配

2 字符类

      一个字符类可以匹配它所包含的任意字符。因此,正则表达式/[abc]/就和字母"a"、"b"、"c"中的任意一个都匹配。另外,可以通过"^"符号来否定字符类,它匹配所有不包含在方括号内的字符。

正则表达式的字符类:

字符 匹配
[...] 方括号内的任意字符
[^...] 不在方括号内的任意字符
. 除换行符合和其他Unicode行终止符之外的任意字符
\w 任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
\W 任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符的字符,注意\w和\S不同
\d 任何ASCII数字,等价于[0-9]
\D  除了ASCII数字之外的任何字符,等价于[^0-9]
\[\b] 退格直接量(特例)
3 重复

     我们在正则模式之后跟随用以指定字符重复的标记。由于某些重复种类非常常用。因此就有一些专门用于表示这种情况的特殊字符。如,"+"用以匹配前一个模式的一个或多个副本。下面总结一下这些表示重复的正则语法。

正则表达式的重复字符语法:

字符 匹配
{n,m} 匹配前一项至少n词,但不能超过m次
{n,} 匹配前一项n次或者更多次
{n} 匹配前一项n次
? 匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0,1}
+ 匹配前一项1次或者多次,等价于{1,}
* 匹配前一项0次或者多次,等价于{0,}

注意:

      在使用"*"和“?”时要注意,由于这些字符可能匹配0个字符,因此它们允许什么都不匹配。如,正则表达式/a*/实际上与字符串"bbbb"匹配,因为这个字符串含有0个a。

非贪婪的重复

  贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如下面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。

  非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。

      如:String str="abcaxc";

    Patter p="ab*c";

4 选择、分组和引用

       正则表达式的语法还包括指定选择项、子表达式分组和引用前一子表达式的特殊字符。

       注意,选择项的尝试匹配次序是从左到右,直到发现了匹配项。如果左边的选择项匹配,就忽略右边的匹配项,即使它产生更好的匹配。因此,当正则表达式/a|ab/匹配字符串“ab”时,它只能匹配第一个字符。

正则表达式的选择、分组和引用字符:

字符 匹配
| 选择。匹配的是该符号左边的子表达式或右边的子表达式,其实就是布尔“或”。
(…)
组合。将几个项目组合为一个单元,这个单元可由*、+、?和|等符号使用,而且 还可以记住和这个组合匹配的字符以供此后的引用使用。
(?:…)
JavaScript 1.5中可以使用其对正则表达式进行分组,但是只是分组。把项目组合到一个单元,但是不记忆与该组匹配的字符。
/n
和第n个分组第一次匹配的字符相匹配。组是括号 中的子表达式(可嵌套,以左半括号开始数,从1开始数,一到数下去 ),以(?:…)分组的组不进行编码

5 修饰符

     正则表达式的修饰符,用以说明高级匹配模式的规则。和之前讨论的正则表达式语法不同,修饰符是放在"/"符号之外的,也就是说,它们不是出现在两条斜线之间,而是第二条斜线之后。

正则表达式修饰符:

字符 匹配
执行不区分大小写的匹配
g 执行一个全局分配,简言之,即找到所有的匹配,而不是在找到第一个之后就停止
m
多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束
       这些修饰符可以任意组合,比如,要想不区分大小写匹配字符串中的第一个单词“java”("java"或者“JAVA”等),可以使用不区分大小写的修饰符来定义正则表达式/\bjava\b/i。要想匹配字符串中所有的单词,则需要添加修饰符g:/\bjava\b/gi。

6 用于模式匹配的String()方法

     String()支持4种使用正则表达式的方法。

  • search()
  • replace()
  • match()
  • split()
1)search 方法       返回与正则表达式查找内容匹配的第一个子字符串的位置(偏移位)。       语法:stringObj.search(rgExp) 
     参数:
            stringObj    必选项。要在其上进行查找的 String 对象或字符串文字。 
           
 rgExp     必选项。包含正则表达式模式和可用标志的正则表达式对象。 
     说明:如果找到则返回子字符至开始处的偏移位,否则返回-1。

例子:
    function SearchDemo(){
var r, re; // 声明变量。
var s = "The rain in Spain falls mainly in the plain.";
re = /falls/i; // 创建正则表达式模式。
re2 = /tom/i;
r = s.search(re); // 查找字符串。
r2 = s.search(re2);
return("r:" + r + ";r2:" + r2); // 返回 Boolean 结果。
}
console.log(SearchDemo());
结果:
     r:18;r2:-1

2)replace 方法 

      返回根据正则表达式进行文字替换后的字符串的复制。 

      语法:tringObj.replace(rgExp, replaceText) 

      参数:stringObj    必选项。要执行该替换的 String 对象或字符串文字。该字符串不会被 replace 方法修改。 

                rgExp   必选项。为包含正则表达式模式或可用标志的正则表达式对象。也可以是 String 对象或文字。如果 rgExp 不是

正则表达式对象,它将被转换为字符串,并进行精确的查找;不要尝试将字符串转化为正则表达式。 

               replaceText   必选项。是一个String 对象或字符串文字,对于stringObj 中每个匹配 rgExp 中的位置都用该对象所包含

的文字加以替换。在 Jscript 5.5 或更新版本中,replaceText 参数也可以是返回替换文本的函数。 

      说明 :replace 方法的结果是一个完成了指定替换的 stringObj 对象的复制。意思为匹配的项进行指定替换,其它不变作为

StringObj的原样返回。 

      ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函

数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的

字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 

stringObject 本身。结果为将每一匹配的子字符串替换为函数调用的相应返回值的字符串值。函数作参可以进行更为复杂的操作。 

例子:

    function replaceDemo() {
var reg = /javascript/gi;
var text = "javaScript Javascript Javascript JavascripT"

return text.replace(reg,"JavaScript");
}
console.log(replaceDemo());
结果:

JavaScript JavaScript JavaScript JavaScript

3)match 方法 

      使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。 

      语法:stringObj.match(rgExp) 

      参数:
              stringObj   必选项。对其进行查找的 String 对象或字符串文字。 

              rgExp   必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名

或字符串文字。 

例子:

    var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text ="Visit my homepage http://blog.csdn.net/~wendy";
var result = text.match(url);
if(result!=null){
var fullurl = result[0];
var protocol = result[1];
var host = result[2];
var path = result[3];
}
console.log("fullurl:"+fullurl);
console.log("protocol:"+protocol);
console.log("host:"+host);
console.log("path:"+path);
结果:

fullurlhttp://blog.csdn.net/
protocol:http
host:blog.csdn.net
path:~wendy
4)split 方法 

     将一个字符串分割为子字符串,然后将结果作为字符串数组返回。 

     语法:stringObj.split([separator[, limit]]) 

     参数 :

             stringObj     必选项。要被分解的 String 对象或文字。该对象不会被 split 方法修改。 

             separator     可选项。字符串或 正则表达式 对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,

返回包含整个字符串的单一元素数组。 

             limit   可选项。该值用来限制返回数组中的元素个数。 

     说明:split ()方法的结果是一个字符串数组,在 stingObj 中每个出现 separator 的位置都要进行分解。separator 不作为任何

数组元素的部分返回。 

例子:

    function SplitDemo(){
var ss;
var s = "The rain in Spain falls mainly in the plain.";// 正则表达式,用不分大不写的s进行分隔。
ss = s.split(/s/i);
return(ss);
}
console.log(SplitDemo());
结果:

["The rain in ", "pain fall", " mainly in the plain."]