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 相关文章推荐
菜鸟javascript基础资料整理2
Dec 06 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
Jan 25 Javascript
Javascript中call和apply函数的比较和使用实例
Feb 03 Javascript
JavaScript随机生成信用卡卡号的方法
Apr 07 Javascript
JavaScript实现上下浮动的窗口效果代码
Oct 12 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
Dec 18 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
May 24 Javascript
基于Angularjs实现分页功能
May 30 Javascript
JavaScript动态绑定详解
Sep 14 Javascript
vue地区选择组件教程详解
May 04 Javascript
javascript实现移动端触屏拖拽功能
Jul 29 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
Oct 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
星际争霸任务指南——神族
2020/03/04 星际争霸
PHP 数组入门教程小结
2009/05/20 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
php自动载入类用法实例分析
2016/06/24 PHP
PHP链表操作简单示例
2016/10/15 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
jQuery textarea的长度进行验证
2009/05/06 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
jquery果冻抖动效果实现方法
2015/01/15 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
2015/05/26 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
vue 实现复制内容到粘贴板clipboard的方法
2018/03/17 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
Python中is与==判断的区别
2017/03/28 Python
详解python函数传参是传值还是传引用
2018/01/16 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
语文教育专业应届生求职信
2013/11/23 职场文书
应届本科生推荐信范文
2013/12/25 职场文书
新驾驶员个人自我评价
2014/01/03 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
实战Python爬虫爬取酷我音乐
2022/04/11 Python