JavaScript(12):RegExp正则表达式对象
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
搜索模式可用于文本搜索和文本替换。
一、正则表达式
正则表达式是由一个字符序列形成的搜索模式。当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
正则表达式可以是一个简单的字符,或一个更复杂的模式。正则表达式可用于所有文本搜索和文本替换的操作。
1、语法:
(1)使用RegExp对象初始化:
var patt=new RegExp(pattern,modifiers);
(2)使用字面量初始化:(常用)
var patt= /pattern/modifiers
- pattern(模式) 描述了表达式的模式
- modifiers(修饰符) 用于指定全局匹配、区分大小写的匹配和多行匹配
其中修饰符是可选的。如:
var patt = /runoob/i
2、实例解析:
/runoob/i 是一个正则表达式。
runoob 是一个正则表达式主体 (用于检索)。
i 是一个修饰符 (搜索不区分大小写)。
1、正则表达式应用举例
1、限制输入
onkeyup="value=value.replace(/[^\d]/g,'') "
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
2、校验合法性:
if(/^[0-9]*$/.test($("input_code").val())) { alert("只能输入数字");}
3、用正则表达式从URL地址中提取文件名
s="http://www.9499.net/page1.htm" s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2") alert(s) //page1
2、计算字符串的长度
(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
二、正则表达式修饰符
修饰符 可以在全局搜索中不区分大小写:
- i:执行对大小写不敏感的匹配。
- g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
- m:执行多行匹配。
三、正则表达式模式
1、JS中正则表达式支持的元字符:
- 枚举方括号表达式,范围方括号表达式,枚举取反方括号表达式,范围取反方括号表达式
- . \w \W \d \D \s \S \b \B \n \r \f \v \888 \uffff \xff
- n? n+ n* n{a} n{a,} n{a,b}及这些量词的非贪婪模式
- ^ $ (?!) (?=) (?:)
- |
其他:
- JS中引用分组请用\number,且不支持''和<>这样的命名分组
- 不支持量词的占有模式
- 不支持逆向环视
- 方括号表达式中复合表达式仅支持如下:[abc0-9] [abc\d] [\d\w^&]等等类似的
- 支持修饰符组合,比如gim mig gi ig等等,无顺序要求
2、部分举例:
方括号:用于查找某个范围内的字符:
- [abc]:查找方括号之间的任何字符。
- [0-9]:查找任何从 0 至 9 的数字。
- (x|y):查找任何以 | 分隔的选项。
元字符:是拥有特殊含义的字符:
- \d:查找数字。
- \s:查找空白字符。
- \b:匹配单词边界。
- \uxxxx:查找以十六进制数 xxxx 规定的 Unicode 字符。
量词:
- n+:匹配任何包含至少一个 n 的字符串。
- n*:匹配任何包含零个或多个 n 的字符串。
- n?:匹配任何包含零个或一个 n 的字符串。
四、使用 RegExp 对象
在 JavaScript 中,RegExp 对象是一个预定义了属性和方法的正则表达式对象。
RegExp 对象属性:
- global:判断是否设置了 "g" 修饰符
- ignoreCase:判断是否设置了 "i" 修饰符
- multiline:判断是否设置了 "m" 修饰符
- lastIndex:用于规定下次匹配的起始位置
- constructor:返回一个函数,该函数是一个创建 RegExp 对象的原型。
- source:返回正则表达式的匹配模式
1、test():测试是否匹配
检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
1、以下实例用于搜索字符串中的字符 "e":
var patt = /e/; patt.test("The best things in life are free!");
字符串中含有 "e",所以该实例输出为:
true
也可以不用设置正则表达式的变量,以上两行代码可以合并为一行:
/e/.test("The best things in life are free!")
2、Javascript 判断是移动端浏览器还是 PC 端浏览器:
if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) { document.write("移动") } else { document.write("PC") }
其他说明:该方法将忽略"g"标志,只要查找到符合模式的字符串即匹配成功。(如果正则对象含有"g"标志,那么每次使用test()将从lastIndex位置开始匹配,匹配成功会更新lastIndex属性值;没有"g"标志,test()将从字符串起点开始匹配,也不会对lastIndex做更新)
2、exec():执行匹配
检索字符串中的正则表达式的匹配。和String的match()方法很类似。
1、该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。返回的数组是Array实例,但还包含额外两个属性:index和input。
- index:表示匹配项在字符串中的起始位置。
- input:表示应用正则表达式的字符串。
当使用(...)分组匹配时,一次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后返回的数组中不包含(?:...)匹配的字符串。
2、以下实例用于搜索字符串中的字母 "e":
/e/.exec("The best things in life are free!");
字符串中含有 "e",所以该实例输出为:
e
其他说明:
(1)若开启"g"标志,执行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
(2)若没开启"g"标志,执行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
五、支持正则表达式的 String 对象的方法
1、search(yourRegexpOrString)方法:搜索
用于检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
使用正则表达式搜索 "Runoob" 字符串,且不区分大小写:
var str = "Visit Runoob!";
var n = str.search(/Runoob/i);
输出结果为:
6
其他说明:该方法将忽略"g"标志和正则对象的lastIndex属性(即总是从开头找起),返回找到的第一个字符的位置,如果未找到返回-1。
search() 方法也可以直接使用字符串作为参数。
字符串参数会转换为正则表达式:
检索字符串中 "Runoob" 的子串:
var str = "Visit Runoob!";
var n = str.search("Runoob");
2、match(yourRegexpOrString)方法:匹配
在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
其他说明:
- 若没开启"g"标志,将只查找第一个匹配的字符串,返回一个对象,包含下标0、index、input,其中下标0等价于index,input是String的引用;
- 若开启"g",返回一个数组,数组的length是匹配的字符串个数,每个元素是每个匹配的起始字符位置。
- 如果没有找到任何匹配的文本, 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; } }
3、replace(yourRegexpOrString,placementString):替换
用于替换一个与正则表达式匹配的子串。
使用正则表达式且不区分大小写将字符串中的 Microsoft 替换为 Runoob :
var str = document.getElementById("demo").innerHTML;
var txt = str.replace(/microsoft/i,"Runoob");
结果输出为:
Visit Runoob!
其他说明:如果没有"g"标志只会替换一次,并且如果参数是字符串而不是正则对象始终替换一次。
placementString中$有特殊用途,见下表:
- $1、$2、...、$99:regexp中捕获的引用分组。
- $&:本次匹配的文本。
- $`:本次匹配到的子串左侧的文本。
- $':本次匹配到的子串右侧的文本。
- $$:$本身。
该方法的第二个参数也可以为一个函数。
replace() 方法使用字符串也可以作为参数:
var str = document.getElementById("demo").innerHTML;
var txt = str.replace("Microsoft","Runoob");
正则表达式参数可用在以上方法中 (替代字符串参数)。
4、split(yourRegexpOrString[,howMany])方法:分割
把一个字符串分割成字符串数组。
其他说明:是arr.join(separatorString)反操作,如果传入"",则每个字符都将会被分隔到数组。howMany指定返回数组的个数。
注意: split() 方法不改变原始字符串。
把一个字符串分割成字符串数组:
var str="How are you doing today?"; var n=str.split(" ");
n 输出一个数组的值:
How,are,you,doing,today?
posted on 2019-03-15 14:54 springsnow 阅读(332) 评论(0) 编辑 收藏 举报