与正则有关的JS方法结合其在项目中的应用

  前言

    最近项目中用到正则匹配比较多,因此打算深入理解和总结下各个与正则有关的方法,再结合在项目中使用的情况。与正则有关的JS方法共有7个,分别是RegExp对象的compile(), exec(), test() 和支持正则表达式的的String()方法为search(), match(), replace(), split()。

  RegExp对象方法

    compile()方法

    该方法用于改变和重新编译正则表达式。语法: RegExpObject.compile(regexp, modifier);  参数1是正则表达式,参数2是规定匹配的类型。“g”用于全局匹配,“i”用于区分大小写,“gi”用于全局区分大小写的匹配。

 var str = 'hello world hello world';
var patt = /hello/g;
//在全局使用"hi"字符串替换"hello"
var str2 = str.replace(patt, 'hi');
console.log(str2);
patt = /world/g;
patt.compile(patt);
//在全局使用"all the world"字符串替换"world"
str2 = str.replace(patt, 'all the world');
console.log(str2);

    在控制台输入如有图  :              

    exec()方法

    该方法用于检索字符串中的正则表达式的匹配。 语法:RegExpObject.exec(string). 参数为要检索的字符串。返回值:返回一个数组,其中存放匹配的结果,若未找到匹配,则返回null。

 var str= "Visit W3School, W3School is a place to study web technology.";
var patt1 = new RegExp("W3School","g");
var patt2 = new RegExp("W3School");
var result;
while ((result = patt1.exec(str)) != null) {
console.log(result);
console.log(patt1.lastIndex);
}
//跳出循环后,返回null,并将lastIndex值重置为0
console.log(patt1.lastIndex); console.log(patt2.exec(str));
console.log(patt2.lastIndex);
/*
while ((result = patt2.exec(str)) != null) {
console.log(result);
console.log(patt2.lastIndex);
}
注意: 此循环是一个死循环,非全局匹配只匹配第一次匹配到的值patt2.exec(str))返回一个数组。
*/

 图(1)         图(2)

    

除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时(如变量patt2,图(2)),返回的数组与调用方法 String.match() 返回的数组是相同的,lastIndex 默认是0。

但是,当 RegExpObject 是一个全局正则表达式时(如变量patt1,图(1)),exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。通过图(1),我们看到第一次检索到'W3Cschool'时,Index值为6,而lastIndex变为14,然后从lastIndex 处开始检索字符串,第二次检索到'W3Cschool',而lastIndex变为24。最后退出循环,lastIndex重置为0。

    test()方法

    该方法用于检测一个字符串是否匹配某个模式。语法:RegExpObject.test(string);返回值:如果字符串string中含有与RegExpObject匹配的文本,则返回true,否则false。下面贴下在项目中使用到的正则应用,手机号码验证:

 var reg = /(13\d|14[57]|15[^4,\D]|17[678]|18\d)\d{8}|170[059]\d{7}/;
//登录事件
$(".lonBtn").click(function() {
var num = $("#phoneNum").val();
var code = $("#code").val();
if( !reg.test(num) || code == '' ) {
mui.alert("手机号码或者验证码错误");
} else {
window.location.href = "memAbout.html";
}
})

    匹配图片格式正则:

//上传图片函数
function uploadImg(domEle) {
$(domEle).change(function() {
if ( typeof FileReader === 'undefined' ) {
alert("你的浏览器不支持FileReader");
return;
}
var file = this.files[0];
console.log(file); //图片格式正则
if ( !/(.*).(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$/.test(file.name) ) {
alert("请上传图片格式内容");
return;
}
// if ( file.size / 1024 > 5 ) { //file.size图片大小单位是B,转换为KB。
// alert("上传图片大小不应超过5KB");
// return;
// }
var r = new FileReader();
r.readAsDataURL(file);
r.onload = function(e) {
// console.log(this.result);
$(domEle).next().html('<img src="' + this.result + '" alt="图片">');
} })
}

  

  String对象方法

    search()方法

    该方法用于检索字符串中指定的子字符串或检索与正则表达式相匹配的子字符串。语法:stringObejct.search(regexp),返回值:第一个与regexp相匹配的子串的起始位置。没有找到返回-1.特别注意search()方法不执行全局匹配。

var str4 = "hello3 w4orld";
//检索指定的子字符串
console.log(str4.search(/wor/)); // -1
//检索与正则表达式匹配的子字符串 非全局
console.log(str4.search(/\d/)); //
// 全局匹配
console.log(str4.search(/\d/g)); //

    由在全局匹配和非全局匹配返回值都一样,说明确实不执行全局匹配。

    match()方法

    该方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。语法:stringObject.match(searchvalue)或stringObject(regexp)。返回值: 存放匹配结果的数组。该数组的内容依赖于regexp是否具有全局标识g。

var str= "Visit W3School, W3School is a place to study web technology.";
console.log(str.match('W3School'));
// 参数为RegExp对象 全局搜索
console.log(str.match(/\d+/g));
// 参数为RegExp对象 非全局搜索 只执行一次匹配
console.log(str.match(/\d+/));

            图(3)

    在调用String 对象的 metch() 方法时,参数为非全局搜索,返回的数组与调用方法RegExp.exec() 返回的数组是相同的。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。如图(3)

    获取请求参数地址:

/**
* 获取请求地址参数
* @param String name
*/
function getUrlParam(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
// 正则是寻找&+url参数名字=值+&
console.log(reg); // /(^|&)index=([^&]*)(&|$)/
var search = encodeURI(window.location.search);
console.log(search); // ?index=1
var r = search.substr(1).match(reg); //匹配目标参数
console.log(r); //["index=1", "", "1", "", index: 0, input: "index=1"]
if (r != null) return decodeURI(unescape(r[2])); return null; //返回参数值
}; var Gindex = getUrlParam("index");

    replace()方法

    该方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。语法: stringObject.repalce(regexp/substr, replacement); 返回值:一个新的字符串。注意:如果regexp具有全局标识g,那么replace()方法将替换所有匹配的子串。否则它只替换第一个匹配的子串。

    split()方法

    该方法用于把一个字符串分割成字符串数组。语法: stringObject.split(separator, howmany);  第一个参数:字符串或正则表达式。第二个参数:可选,该参数可指定返回的数组的最大长度。

 var str5 = "15hell1o w3o";
console.log(str5.split(/\d+/)); // ["", "hell", "o w", "o"]
// 空字符串("")作为分割,那么字符串每个字符之间都会被分割。
console.log(str5.split("")); //

  

与正则有关的JS方法结合其在项目中的应用的更多相关文章

  1. Immutable.js 以及在 react+redux 项目中的实践

    来自一位美团大牛的分享,相信可以帮助到你. 原文链接:https://juejin.im/post/5948985ea0bb9f006bed7472?utm_source=tuicool&ut ...

  2. C#后台程序与HTML页面中JS方法互调(功能类似于Ajax中的DWR)

    此方法适用于 C#中嵌入WebBrowser(浏览器) 通过浏览器中加载的页面与C#的后台代码进行交互. 一.C#程序 1.在C#窗体中添加WebBrowser(浏览器),将页面的URL添加到浏览器中 ...

  3. linux 下用renameTo方法修改java web项目中文件夹名称问题

    经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...

  4. 了解CSS in JS(JSS)以及在React项目中配置并使用JSS

    目录 认识JSS 什么是JSS JSS 的常见实现 JSS 的好处与坏处 好处 坏处 使用模块化CSS实现JSS 安装插件 在React项目中的tsconfig.json中添加配置 vscode项目中 ...

  5. 三种JS方法确定元素在数组中的索引值

    第一种:数组遍历 function search(arr,dst){ var i = arr.length; while(i-=1){ if (arr[i] == dst){ return i; } ...

  6. eclipse 修改js文件无法编译到项目中

    1.场景重现 在今天修改js文件完善功能时,发现在eclipse中修改了文件后,刷新页面功能无法同步: 2.分析原因 查看编译路径,文件没有修改: 2.1 可能是缓存问题: 2.2 项目未编译: 3. ...

  7. 客户端调用web中js方法(C调B)跨域问题

    这几天遇到了个棘手问题(c调b),经过排错查出了问题. 一,问题描述如下: 1.客户端需要调用father.html中一个js方法,特殊之处在于 这个father.html中有个iframe嵌套了一个 ...

  8. 项目中解决实际问题的代码片段-javascript方法,Vue方法(长期更新)

    总结项目用到的一些处理方法,用来解决数据处理的一些实际问题,所有方法都可以放在一个公共工具方法里面,实现不限ES5,ES6还有些Vue处理的方法. 都是项目中来的,有代码跟图片展示,长期更新. 1.获 ...

  9. react项目中引入了redux后js控制路由跳转方案

    如果你的项目中并没有用到redux,那本文你可以忽略 问题引入 纯粹的单页面react应用中,通过this.props.history.push('/list')就可以进行路由跳转,但是加上了redu ...

随机推荐

  1. python已安装包的查看方法和requirements.text的使用

     1.已经安装包的查看方法 命令pip freeze 2. 批量导出命令 pip freeze >requirements.txt 3. 批量导入命令 pip install -r requir ...

  2. BKDRHash算法的初步了解

    字符串hash最高效的算法,  搜了一下,  原理是: 字符串的字符集只有128个字符,所以把一个字符串当成128或更高进制的数字来看,当然是唯一的 这里unsigned不需要考虑溢出的问题,  不过 ...

  3. Date日期类,Canlendar日历类,Math类,Random随机数学类

    Date日期类,SimpleDateFormat日期格式类 Date  表示特定的时间,精确到毫秒 常用方法 getTime() setTime() before() after() compareT ...

  4. jq动态添加代码监听问题

     $(document).on('click', '.class', function() { console.log($(this).attr('id')); }); 

  5. Ubuntu matplotlib显示中文乱码的解决方法

    https://blog.csdn.net/huuinn/article/details/78968966

  6. @loj - 2093@ 「ZJOI2016」线段树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Yuuka 遇到了一个题目:有一个序列 a1,a2,..., ...

  7. IDEA使用中文api鼠标提示的设置

    最近都在用IDEA来练习,发现有的方面确实比eclipse好用,eclipse里面可添加中文的API 提示,对初期的我帮助很大,但是IDEA却没有找到添加的地方,一直以来还以为不支持这个功能,比较遗憾 ...

  8. oracle函数 SOUNDEX(c1)

    [功能]返回字符串参数的语音表示形式 [参数]c1,字符型 [返回]字符串 [说明]相对于比较一些读音相同,但是拼写不同的单词是非常有用的. 计算语音的算法: 1.保留字符串首字母,但删除a.e.h. ...

  9. @codeforces - 1205C@ Palindromic Paths

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 这是一道交互题. 现在有一个 n*n 的矩阵,每个位置是 0 或 ...

  10. Java排序算法总结

    1.冒泡排序 冒泡排序是排序算法中最基本的一种排序方法,该方法逐次比较两个相邻数据的大小并交换位置来完成对数据排序,每次比较的结果都找出了这次比较中数据的最大项,因为是逐次比较,所以效率是O(N^2) ...