JavaScript(12):RegExp正则表达式对象

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。

搜索模式可用于文本搜索和文本替换。

一、正则表达式

正则表达式是由一个字符序列形成的搜索模式。当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。

正则表达式可以是一个简单的字符,或一个更复杂的模式。正则表达式可用于所有文本搜索和文本替换的操作。

语法:

var patt=new RegExp(pattern,modifiers);

或者

var patt=/pattern/modifiers
  • pattern(模式) 描述了表达式的模式
  • modifiers(修饰符) 用于指定全局匹配、区分大小写的匹配和多行匹配

其中修饰符是可选的。如:

var patt = /runoob/i

实例解析:

/runoob/i  是一个正则表达式。

runoob  是一个正则表达式主体 (用于检索)。

i  是一个修饰符 (搜索不区分大小写)。

二、正则表达式修饰符

修饰符 可以在全局搜索中不区分大小写:

  • i:执行对大小写不敏感的匹配。
  • g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
  • m:执行多行匹配。

三、正则表达式模式

方括号用于查找某个范围内的字符:

  • [abc]:查找方括号之间的任何字符。
  • [0-9]:查找任何从 0 至 9 的数字。
  • (x|y):查找任何以 | 分隔的选项。

元字符是拥有特殊含义的字符:

  • d:查找数字。
  • s:查找空白字符。
  • :匹配单词边界。
  • uxxxx:查找以十六进制数 xxxx 规定的 Unicode 字符。

量词:

  • n+:匹配任何包含至少一个 n 的字符串。
  • n*:匹配任何包含零个或多个 n 的字符串。
  • n?:匹配任何包含零个或一个 n 的字符串。

四、支持正则表达式的 String 对象的方法

1、search() 方法:用于检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

使用正则表达式搜索 "Runoob" 字符串,且不区分大小写:

var str = "Visit Runoob!"; 
var n = str.search(/Runoob/i);

输出结果为:6

search() 方法使用字符串

search 方法可使用字符串作为参数。字符串参数会转换为正则表达式:

检索字符串中 "Runoob" 的子串:

var str = "Visit Runoob!"; 
var n = str.search("Runoob");

2、replace() 方法:用于替换一个与正则表达式匹配的子串。

使用正则表达式且不区分大小写将字符串中的 Microsoft 替换为 Runoob :

var str = document.getElementById("demo").innerHTML; 
var txt = str.replace(/microsoft/i,"Runoob");

结果输出为:Visit Runoob!

replace() 方法使用字符串

replace() 方法将接收字符串作为参数:

var str = document.getElementById("demo").innerHTML; 
var txt = str.replace("Microsoft","Runoob");

正则表达式参数可用在以上方法中 (替代字符串参数)。

正则表达式使得搜索功能更加强大(如实例中不区分大小写)。

3、match() 方法:在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

注意: match() 方法将检索字符串 String Object,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。

在字符串中查找 "ain":

var str="The rain in SPAIN stays mainly in the plain"; 
var n=str.match(/ain/g);

n 输出数组结果值:ain,ain,ain

判断是否微信浏览器:

function is_weixn(){  
    var ua = navigator.userAgent.toLowerCase();  
    if(ua.match(/MicroMessenger/i)=="micromessenger") {  
        return true;  
    } else {  
        return false;  
    }  
}

4、split() 方法:把一个字符串分割成字符串数组。

提示: 如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。

注意: split() 方法不改变原始字符串。

把一个字符串分割成字符串数组:

var str="How are you doing today?";
var n=str.split(" ");

n 输出一个数组的值:How,are,you,doing,today?

五、使用 RegExp 对象

在 JavaScript 中,RegExp 对象是一个预定义了属性和方法的正则表达式对象。

RegExp 对象属性

  • constructor返回一个函数,该函数是一个创建 RegExp 对象的原型。
  • global判断是否设置了 "g" 修饰符
  • ignoreCase判断是否设置了 "i" 修饰符
  • lastIndex用于规定下次匹配的起始位置
  • multiline判断是否设置了 "m" 修饰符
  • source返回正则表达式的匹配模式

1、test():检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

当一个具有g标志的正则表达式调用test()方法时,它的行为和exec()相同,既它从lastIndex处开始检索特定的字符串,如果它发现匹配,就将lastIndex设置为紧接在那个匹配之后的字符的位置,这样我们就可以使用方法test()来遍历字符串了。

以下实例用于搜索字符串中的字符 "e":

var patt = /e/;
patt.test("The best things in life are free!");

字符串中含有 "e",所以该实例输出为:true

你可以不用设置正则表达式的变量,以上两行代码可以合并为一行:

/e/.test("The best things in life are free!")

Javascript 判断是移动端浏览器还是 PC 端浏览器:

if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
    document.write("移动")
} else {
    document.write("PC")
}

2、exec():检索字符串中的正则表达式的匹配。

RegExp的exec()方法和String的match()方法很类似。

该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。返回的数组是Array实例,但还包含额外两个属性:index和input。

  • index:表示匹配项在字符串中的起始位置。
  • input:表示应用正则表达式的字符串。

以下实例用于搜索字符串中的字母 "e":

/e/.exec("The best things in life are free!");

字符串中含有 "e",所以该实例输出为:e

这里分两种情况,一种是global匹配,一种是非global匹配。

global模式执行exec()匹配成功一次以后,再次执行exec()时,会从前一次匹配的最后一位开始继续向后匹配。例:

var exp = /.at/g
var matches = exp.exec('cat, bat, sat, fat'); //第一次匹配
matches.index => 0
matches.input => 'cat, bat, sat, fat'
matches => ['cat']
exp.lastIndex => 3
matches = exp.exec('cat, bat, sat, fat'); //第二次匹配
matches.index => 5
matches.input => 'cat, bat, sat, fat'
matches => ['bat']
exp.lastIndex => 8

非global模式执行exec()匹配成功一次以后,再次执行exec()时,会从头开始重新匹配。

var exp = /.at/
var matches = exp.exec('cat, bat, sat, fat'); //第一次匹配
matches.index => 0
matches.input => 'cat, bat, sat, fat'
matches => ['cat']
exp.lastIndex => 0
matches = exp.exec('cat, bat, sat, fat'); //第二次匹配
matches.index => 0
matches.input => 'cat, bat, sat, fat'
matches => ['cat']
exp.lastIndex => 0

返回的数组是Array实例:

当使用(...)分组匹配时,一次exec()会匹配到多个结果

var exp = /(there)s+(you)s+(are)/;
var matches = exp.exec('hey, there you are my dear');
matches = ["there you are", "there", "you", "are"];

matches[0]:匹配整个表达式字符串。

matches[1]:匹配第一个(...)内的字符串,之后以此类推。

注意:含(?:...)非捕获分组的表达式执行exec后返回的数组中不包含(?:...)匹配的字符串。

原文地址:https://www.cnblogs.com/springsnow/p/12299078.html