实战JS正则表达式

原文:实战JS正则表达式

-正则表达式是一种文本模式的匹配工具。

-文章导读:

    --1.正则对象的属性和方法

    --2.字符串对象的方法

    --3.使用正则表达式:

      ---3.1 给字符串加上千分符

      ---3.2 字符串中出现次数最多的字母

      ---3.3 在多行中使用正则表达式

      ---3.4 从url中提取子域名

      ---3.5 分割Unicode字符

      ---3.6 在location对象中使用正则

 

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------

[新建正则表达式]:

1 var  regexp = /aabb/g; //g可省
2 var  regexp = new Regexp("xyz","g"); //第二个参数可省

区别在于:

1.采用字面量的写法新建的正则表达式对象在代码编译时就会生成,是平常开发中常用的方式;

2.采用构造函数生成的正则对象要在代码运行时生成。

 [使用正则表达式]:

 正则对象的方法是指这样使用的: RegExp对象.方法(字符串)

 字符串对象的方法是这样使用:字符串.方法(RegExp对象)

一、 正则对象的属性和方法

1.1 正则对象的属性:

1 ignoreCase //返回一个布尔值表示正则对象是否设置了i修饰符,是一个只读属性
2 global //表示正则对象是否设置了g修饰符,返回布尔值
3 multiline //表示是否设置了m修饰符,返回一个布尔值
4 lastIndex //返回下一次开始搜索的位置,该属性可读写,但只在设置了g修饰符时有意义
5 source //返回正则表达式的字符串形式(不包括反斜杠),只读属性

这样用:

1  i  --执行忽略大小写的匹配
2  g  --执行全局匹配(可以查看所有的匹配而不是只找到第一个匹配后就停止)
3  m  --执行多行匹配

 

1.2 test方法

test方法返回布尔值,用来验证字符串是否符合某个模式。如果正则表达式带有g修饰符,则每一次test方法都从上一次匹配结束的位置开始匹配。

使用了g修饰符的正则对象,表示要记录搜索的位置,接着使用test方法,每次开始搜索的委会都是上一次匹配的后一个位置:

如果正则表达式是一个空字符串,则会匹配所有的字符串,但前提是使用new RegExp()的方式:

 

1.3 exec方法

 exec()返回匹配的结果,匹配成功exec方法返回装有匹配结果的数组,匹配失败返回null:

如果正则表达式包含圆括号,则返回的数组会包括多个元素。首先是整个匹配成功的结果,后面是圆括号里匹配成功的结果,如果有多个圆括号,他们的匹配成功的结果都会成为数组元素:

对于调用exec方法后返回的数组具有以下两个属性:

1 input --整个原待匹配的字符串
2 index --整个模式匹配成功的开始位置

 同样,给正则表达式加上g修饰符就可以多次使用exec方法,下一次搜索的位置从上一次成功匹配结束的位置开始。

如果正则对象是一个空字符串:

 

二、字符串对象的方法

 

1 match-----返回匹配的子字符串
2 search----搜索
3 replace---替换
4 split-----分割

2.1 match()方法

字符串对象的match方法与正则对象的exec方法比较类似:

但是如果正则表达式带有g修饰符,那么match方法与exec方法就有差别了:

可以看到match返回了所有成功匹配的结果,但是exec方法只返回了一个。

 

2.2 search方法

search方法返回匹配成功的位置在整个字符串中的索引,如果没有匹配成功任何字符则返回-1,search方法会自己忽略g修饰符。

 

2.3 replace方法

str.replace('搜索模式','替换的内容');

可以看到,如果正则表达式不带g修饰符,那么replace方法会替换第一个匹配成功的结果,如果加上了g修饰符,那么会替换所有匹配成功的值。

replace方法的第二个参数可以使用$符号,用来指代所要替换的内容:

1 $&-----指代匹配的字符串
2 $`-----匹配结果前面的文本
3 $'-----匹配结果后面的文本
4 $n-----指代匹配成功的第n组内容,n从1开始
5 $$-----指代美元符号$

replace方法的第二个参数也可以是函数,用于将第一个参数匹配到的值替换为函数返回值。

同时,作为replace方法的第二个参数的函数也可以由多个参数。它的第一个参数是整个匹配的内容,第二个参数是组匹配(这时有多少个组匹配就有多少个参数),此外最后还可以添加两个参数,倒数第二个参数是扑捉到的内容在整个字符串中的位置,最后一个参数是原字符串。

 

2.4 split() 方法

split(‘字符串的分割正则’,‘返回数组的最大成员数’);返回分割后各部分组成的数组。

可以变换正则的匹配规则来分割字符串。

上面正则的匹配规则是以0或多个a来进行分割,如果加上括号则括号匹配的部分也就是分割规则也会作为数组成员返回。

 

三、使用正则表达式

正则表达式不仅灵活还很强大,用它能很简洁的实现很多实用的功能,下面简单列举一些:

3.1给字符串加千分符

1          function spli(str){
2              var re = /(?=(?!\b)(\d{3})+$)/g;
3              return str.replace(re,',');
4          }
5          console.log(spli(str));

其中的(?=exp)用来匹配exp前面的位置,(?!exp)匹配后面跟的不是exp的位置,他们都是零宽断言。

如果要是不用正则表达式的话,代码会多些:

 1          var str = '12345432';//->[]
 2          function spli(str){
 3             var iNum = str.length%3;//->0,1,2
 4             var prev = '';
 5             var arr = [];
 6             var iNow = 0;
 7             var tmp = '';
 8             //千分号是从后向前三位三位加的,所以把三位余出来的从前面提取到
 9             if(iNum !=0){
10                 prev = str.substring(0,iNum);
11                 arr.push(prev);
12             }
13             //取到多余部分后面的
14             str = str.substring(iNum);
15             for(var i=0;i<str.length;i++){
16                 iNow++;
17                 tmp += str[i];
18                 if(iNow==3 && tmp){
19                     //数组里面放的是三位的数
20                     arr.push(tmp);
21                     tmp = '';
22                     iNow = 0;
23                 }
24             }
25             return arr.join(',');
26          }
27          console.log(spli(str));

View Code

 

3.2字符串中出现次数最多的字符

 1         var str = 'kkkkkkkaaakkkkkkaaaaasddd';
 2         function most(str){
 3              //排序,正则匹配子项
 4              var arr = str.split('');
 5              arr.sort();
 6              str = arr.join('');
 7             // \1匹配前面相同的,也就是说跟(\w)相同的
 8              var re = /(\w)\1+/g;
 9              var num = 0;
10              var value = '';
11              //这里的$0就是找到的重复的整体
12              str.replace(re,function($0,$1){
13                  //alert($0);
14                  if(num<$0.length){
15                   num = $0.length;
16                   value = $1;
17                  }
18              });
19              return '出现次数最多的字符是'+value+'出现了'+num+'次';
20         }
21         console.log(most(str));

其中\1代表分组1匹配的文本。

3.3 在多行中使用正则表达式

 

^符号用来匹配输入/字符串的开始。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处。

3.4 从url中提取子域名

上面的正则匹配/开始的字符串匹配到第一个.就停止了,http://长度为7,所以用了substr(7)之后就会返回子域名了。

3.5 分割Unicode字符

通常用来匹配字符的\w和\W只会匹配基本的ACSCII字符,要匹配Unicode字符的话就要另做处理了:

3.6 在location对象中使用正则

这里有个我越看越晕的例子,额:

来自小胡子==。[玩转正则之highlight高亮

四、其他

正则表达式的收集:

[常用的正则表达式收集

[ js常用正则表达式]

参考资料:

[RegExp MDN]

[玩转正则之highlight高亮

 

这里我只是总结了正则表达式相关的方法和属性,强烈建议阅读:正则表达式30分钟入门教程    它教会你如何写正则表达式,再结合文章上面提到的方法,写着写着,正则就不是那么遥不可及了,非常实用喔。

 

时间: 2024-10-30 21:22:56

实战JS正则表达式的相关文章

js正则表达式replace替换变量方法_javascript技巧

JavaScript正则实战(会根据最近写的不断更新) 1.javascript 正则对象替换创建 和用法: /pattern/flags 先简单案例学习认识下replace能干什么 正则表达式构造函数: new RegExp("pattern"[,"flags"]); 正则表达式替换变量函数:stringObj.replace(RegExp,replace Text); 参数说明: pattern -- 一个正则表达式文本 flags -- 如果存在,将是以下值:

js正则表达式密码匹配

问题描述 js正则表达式密码匹配 大神们,我在在js中正则表达式判断密码是否匹配, 这方面我是新手还请大神们指点: (1)同时包含数字,字母,特殊符号 (2)包含字母和数字 (3)只包含数字或字母 解决方案 试试吧,不一定对. 正则:(1)/^(?!d+$)(?![a-zA-z]+$)(?![^0-9a-zA-Z]+$)/ (2)/^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/ (3) /^[0-9a-zA-Z]+$/ 解决方案二: ^(?=.*[0-

精通 JS正则表达式

正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证 •替换文本.可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字 •根据模式匹配从字符串中提取一个子字符串.可以用来在文本或输入字段中查找特定文字 正则表达式语法 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.该模式描述在查找文字主体时待匹配的一个或多个字符串

JS正则表达式获取字符串中特定字符的方法

 这篇文章主要介绍了JS正则表达式获取字符串中得特定字符,通过replace的回调函数获取,需要的朋友可以参考下 实现的效果:在字符串中abcdefgname='test'sddfhskshjsfsjdfps中获取name的值test    实现的机制:通过replace的回调函数获取.    代码:  代码如下: var str = "abcdefgname='test'sddfhskshjsfsjdfps";  var reg = /name='((w|-|s)+)/ig;  st

利用js正则表达式验证手机号,email地址,邮政编码

 利用js正则表达式验证手机号,email地址,邮政编码.需要的朋友可以过来参考下,希望对大家有所帮助 手机号码的验证(13开头和158,159开头,共11位)  代码如下: var re; var ss=document.getElementById('textbox3').value; re= /^(13[0-9]{9})|(15[89][0-9]{8})$/ if(re.test(ss))  {    document.getElementById('label3').innerText=

js正则表达式中test,exec,match方法的区别介绍

 本篇文章主要是对js正则表达式中test,exec,match方法的区别进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 js正则表达式中test,exec,match方法的区别说明   test  test 返回 Boolean,查找对应的字符串中是否存在模式. var str = "1a1b1c"; var reg = new RegExp("1.", ""); alert(reg.test(str)); // true     e

js正则表达式 验证百分数,要求只能输入0%-100% 之间的数

问题描述 js正则表达式 验证百分数,要求只能输入0%-100% 之间的数 填写举例:0%.50%.100%,可能是0%-100%其中的任何数字,最多小数点后保留2位,例如97.51%/98.32%.? 解决方案 ^(100|[1-9]d|d)(.d{1,2})?%$ 解决方案二: Js中运用正则表达式验证输入是否有特殊字符 . 解决方案三: ^(100|[1-9]d|d)(.d{1,2})?%$ 解决方案四: ^([1-9]{1}[0-9]{0,1}|0|100)(.d{1,2}){0,1}%

JS正则表达式替换页面中内容

问题描述 JS正则表达式替换页面中内容 我想用正则表达式替换table中除了标签""<tr class=""template"" ng-repeat=""model in model.child""></td>""里面的ng-model中的内容,将ng-model=""model.*""替换成ng-model="&

额,又来了,再求一个清除所有标签所有属性的的JS 正则表达式^^

问题描述 额,又来了,再求一个清除所有标签所有属性的的JS 正则表达式^^比如<p style="border:1px;">呵呵</p> <span id="row">第一行</span>等,清除完后只要<p>呵呵</p> <span>第一行</span> 这样就可以了, 解决方案 应该满足你的要求了.<!DOCTYPE html PUBLIC "-//W