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 相关文章推荐
日期函数扩展类Ver0.1.1
Sep 07 Javascript
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
Aug 13 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
Jul 21 Javascript
JavaScript实现上下浮动的窗口效果代码
Oct 12 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
Nov 18 Javascript
Highcharts入门之基本属性
Aug 02 Javascript
javascript宿主对象之window.navigator详解
Sep 07 Javascript
详解jquery validate实现表单验证 (正则表达式)
Jan 18 Javascript
vue2.0获取鼠标位置的方法
Sep 13 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
Jul 26 Javascript
vue 检测用户上传图片宽高的方法
Feb 06 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
Nov 06 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
php注入实例
2006/10/09 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
如何正确配置Nginx + PHP
2016/07/15 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
javascript 原型继承介绍
2011/08/30 Javascript
五段实用的js高级技巧
2011/12/20 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
sails框架的学习指南
2014/12/22 Javascript
基于jquery实现的仿优酷图片轮播特效代码
2016/01/13 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
移动端日期插件Mobiscroll.js使用详解
2016/12/19 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
setTimeout学习小结
2017/02/08 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
pyqt5实现登录界面的模板
2020/05/30 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
python 调用Google翻译接口的方法
2020/12/09 Python
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
外贸专业求职信
2014/03/09 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
投资合作协议书
2014/04/17 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
大学生支教感言
2015/08/01 职场文书
《鲸》教学反思
2016/02/23 职场文书
Python 制作自动化翻译工具
2021/04/25 Python