javascript 正则表达式相关应介绍


Posted in Javascript onNovember 27, 2012

string 对象
1、str.match(RegExp)
在str中搜索匹配RegExp的字符串并保存在一个数组内返回,
如果RegExp不是全局设置(/g),仅匹配一次

("abc112dwfwabcwef2abc3wfwabcasqf453abcqwf24j234h").match(/abc\d*/g); 
//结果 
["abc112", "abc", "abc3", "abc", "abc"]

该方法中,如果正则表达式不是全局匹配模式(g标记),第一个元素将是匹配的字符串,其余是正则中捕获的字符串,并且该数组具备2个属性:
input 用于检测的字符串
index 匹配的字符串在用于检测字符串中的开始位置。
(关于这2个属性可以参考 RegExp.exec() 方法)
2、str.search(regExp)
返回符合匹配RegExp的第一个字符串的位置,如果没有匹配返回-1,全局标记没有意义,因为只匹配一次,
该方法也忽略 regExp 的 lastIndex 属性,并且总是从字符串的开始进行检索。
3、str.replace(RegExp,replaceText)
将匹配RegExp 的字符串替换为replaceText,如果 RegExp 没有全局设置,只匹配一次,使用全局模式将替换所有匹配的字符串。
如果RegExp 中使用了捕获分组匹配,则replaceText中的$具有特殊含义
$1、$2、...、$99 //与 RegExp 中的第 1 到第 99 个子表达式相匹配的文本。
$& // 与 regexp 相匹配的子串。
$` // 位于匹配子串左侧的文本。
$' // 位于匹配子串右侧的文本。
$$ // 匹配$符号自身。
注意,你需要考虑RegExp中捕获分组的数量,如果你只设置了2个捕获,那$3将不再具有特殊含义
("123ab12c11d_4532").replace(/a(b\d*)c(\d*)d/,"$1@$2-")
//将得到:
"123b12@11-_4532"
4、str.replace(RegExp,function)
str.replace 的第二个参数可以是函数,函数的返回值将作为匹配字符的替换内容,
注意,如果要全局匹配RegExp仍然需要全局g标记。
函数的参数依次是:
匹配的字符串,
配置的捕获子串(多个),
匹配字符串的开始位置,
用于匹配的原字符串
注意,请根据RegExp中捕获分组的设置数量来定义函数参数个数,如果参数太少将可能导致“匹配字符串的开始位置” 和 “用于匹配的原字符串” 不能在参数中出现,当然也可以在函数内使用arguments对象解决这个问题,arguments(arguments.length-2) 就是匹配字符串的开始位置,arguments(arguments.length-1) 就是 用于匹配的原字符串。
var newStr = ("123ab12c11d_4532").replace(/a(b\d*)c(\d*)d/g,function(s,s1,s2,pos,oldStr){ 
return "@"+s1+"@"+s2+"@"; 
}) ; 
//将得到 
"123@b12@11@_4532"

5、str.split(RegExp[,limit])
将字符串str用符合匹配的字符串分割成数组,limit 可选,用于限定返回的数组长度
("ada2afa4fcas6afa").split(/\d/,3) // "ada,afa,fcas"
6、RegExp.exec("str") 方法
在str中查找匹配的字符串,注意,每次运行该方法只匹配一次,要匹配多个需要将RegExp设置为/g,并多次运行exec()方法,每次匹配返回值 result = RegExp.exec("str")
result为一个数组,这个数组长度为1,数组元素为找到的匹配的子串,
另外,这个数组被额外赋给了2 个属性:
result.index 表示匹配的子串在原字符串的开始位置
result.input 就是原字符串
当再也无法找到符合匹配的子串时,返回 result = null,并设置 RegExp.lastIndex=0
RegExp.lastIndex 是正则表达式的属性,表示当前将从字符串的哪个位置开始匹配,初始值为0。
如果RegExp被设置为全局的,在匹配一个字符串一次之后,使用同一个RegExp对一个新的字符串进行匹配请先手动设置 RegExp.lastIndex=0
如果RegExp 不是全局匹配模式,在程序中又写了一个循环,根基返回值 result来决定是否终止匹配,从而试图匹配完这个字符串,那么,只要有符合匹配条件的子串,就必定造成死循环,因为非全局匹配只对字符串匹配一次,结果每次运行匹配操作都是匹配第一个子串,返回的 result 不为空,这是个比较容易犯的错误。
var str = "1Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g"); 
var result; 
document.write(patt.lastIndex+"<br />"); 
document.write("=====================================<br />"); 
while ((result = patt.exec(str)) != null) { 
document.write(patt.lastIndex+"<br />"); 
document.write(result.constructor.name+"<br />"); 
document.write(result.length+"<br />"); 
document.write(result[0]+"<br />"); 
document.write(result.index+"<br />"); 
document.write(result.input+"<br />"); 
document.write("=====================================<br />"); 
} 
document.write(patt.lastIndex+"<br />"); 
// 运行结果: 
===================================== 
Array 
W3School 
Visit W3School, W3School is a place to study web technology. 
===================================== 
Array 
W3School 
Visit W3School, W3School is a place to study web technology. 
=====================================

7、RegExp.test("str") 方法
该方法与 RegExp.exec 类似,不同的是仅返回true或false
RegExp.lastIndex 的含义是一样的(这是RegExp的属性,跟是使用test方法还是exec方法无关)
如果同一个RegExp 先后使用了test方法和exec方法,你可能需要手动设置 RegExp.lastIndex=0,这些方法是共享同一个RegExp对象的lastIndex 属性的
var str = "1Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g"); 
var result ; 
result = patt.test(str); 
alert(result); //true 
result = patt.test(str); 
alert(result); //true 
result = patt.test(str); 
alert(result); //false

IE9+ 、较新版本的 chrome、firefox 中 , str.match(reg) 执行完毕后,无论是否全局匹配,是否存在匹配结果 ,lastindex 被重置,reg.lastIndex = 0 , reg.test(str) 执行后,如果正则是非全局匹配的,lastindex 被重置, re.lastIndex = 0 在 IE8 及以下,正则匹配执行后除非没有匹配结果,否则 re.lastIndex 是最后一个匹配字符串的结尾字符的位置 +1,即lastIndex 没有被重置
Javascript 相关文章推荐
免费空间广告万能消除代码
Sep 04 Javascript
JavaScript 笔记二 Array和Date对象方法
May 22 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
May 07 Javascript
利用毫秒减值计算时长的js代码
Sep 22 Javascript
js实现可得到不同颜色值的颜色选择器实例
Feb 28 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
Jun 05 Javascript
JS实现三个层重叠点击互相切换的方法
Oct 06 Javascript
AngularJS变量及过滤器Filter用法分析
Nov 22 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
Oct 18 Javascript
javaScript字符串工具类StringUtils详解
Dec 08 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
Jan 07 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
Aug 14 jQuery
javascript 二进制运算技巧解析
Nov 27 #Javascript
JavaScript prototype属性深入介绍
Nov 27 #Javascript
Knockoutjs的环境搭建教程
Nov 26 #Javascript
jquery ajax请求实例深入解析
Nov 26 #Javascript
jquery validate poshytip 自定义样式
Nov 26 #Javascript
一个可拖拽列宽表格实例演示
Nov 26 #Javascript
JS编程小常识很有用
Nov 26 #Javascript
You might like
php.ini 中文版
2006/10/28 PHP
php利用curl抓取新浪微博内容示例
2014/04/27 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
js parsefloat parseint 转换函数
2010/01/21 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
浅析Python中的多重继承
2015/04/28 Python
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
Python反射的用法实例分析
2018/02/11 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
python删除文件、清空目录的实现方法
2020/09/23 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
机电专业个人自荐信格式模板
2013/09/23 职场文书
竞职演讲稿范文
2014/01/11 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
第二课堂活动总结
2014/05/07 职场文书
2014年个人债务授权委托书范本
2014/09/22 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
Python3 类型标注支持操作
2021/06/02 Python