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 相关文章推荐
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
Jul 09 Javascript
Jquery.Form 异步提交表单的简单实例
Mar 03 Javascript
javascript实现的元素拖动函数宿主为浏览器
Jul 21 Javascript
javascript中eval函数用法分析
Apr 25 Javascript
jquery.cookie.js用法实例详解
Dec 25 Javascript
jquery单击文字或图片内容放大并居中显示
Jun 23 jQuery
微信小程序中post方法与get方法的封装
Sep 26 Javascript
vue滚动轴插件better-scroll使用详解
Oct 17 Javascript
Vue中如何实现proxy代理
Apr 20 Javascript
vue forEach循环数组拿到自己想要的数据方法
Sep 21 Javascript
JavaScript的console命令使用实例
Dec 03 Javascript
基于javascript实现碰撞检测
Mar 12 Javascript
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
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
php中随机显示图片的函数代码
2011/06/23 PHP
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
微信小程序实现手指触摸画板
2018/07/09 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
layui实现三级联动效果
2019/07/26 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
档案保密承诺书
2014/06/03 职场文书
服务理念口号
2014/06/11 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
导游词之无锡梅园
2019/11/28 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
Golang 并发编程 SingleFlight模式
2022/04/26 Golang
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技