正则表达式(英语: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后返回的数组中不包含(?:...)匹配的字符串。