一、js的正则表达式

  1、什么是正则表达式

    正则表达式(regular expression)是一个描述字符模式的对象,ECMAScript的RegExp类表示正则表达式,而String和RegExp都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。

  2、正则表达式的创建方式:

    2.1 方式1:new方式创建

      var box = new RegExp('box', 'ig');

    2.2 方式2:字面量方式创建

      var box = /box/ig;

    2.3第一个参数表示被匹配的字符串,第二个参数表示正则的匹配方式,主要有三个匹配类型分别为:

      i:忽略被匹配字符串的大小。

      g:被匹配的字符串进行全局匹配。

      m:被匹配的字符串进行多行匹配。

  3、正则表达式的匹配方法:

    3.1方法1:new()方法   

      3.1.1使用new运算符的test方法示例:

        var pattern = new RegExp('box', 'i'); //创建正则模式,不区分大小写

        var str = 'This is a Box!'; //创建要比对的字符串

        alert(pattern.test(str)); //通过test()方法验证是否匹配,返回的是个布尔值,true或flase

      3.1.2使用字面量方式的test方法示例:

        var pattern = /box/i; //创建正则模式,不区分大小写

        var str = 'This is a Box!';

        alert(pattern.test(str));

      3.1.3使用一条语句实现正则匹配

        alert(/box/i.test('This is a Box!')); //模式和字符串替换掉了两个变量

    3.2方法2:exec()方法

      3.2.1方法与test()类似。

        var pattern = /box/i;  //创建正则模式,不区分大小写

        var str = 'This is a Box!';  //创建要比对的字符串

        alert(pattern.exec(str)); //匹配了返回数组,否则返回null

  4、string中的正则

    4.1使用match方法获取匹配数组

      var pattern = /box/ig; //全局搜索

      var str = 'This is a Box!,That is a Box too';

      alert(str.match(pattern)); //匹配到两个Box,Box,返回的是匹配到的字符串
      alert(str.match(pattern).length); //获取数组的长度

      注释:如果是局部搜索,数组中就只能匹配到一个元素。

    4.2 使用search来查找匹配数据

      var pattern = /box/ig;

      var str = 'This is a Box!,That is a Box too';

      alert(str.search(pattern)); //查找到第一个符合条件的字符串就返回该位置,如果没有查找到则返回-1

      注释:因为search方法查找到第一个就会返回,也就是说无需g全局

    4.3 使用replace替换匹配到的数据

      var pattern = /box/ig;//全局搜索

      var str = 'This is a Box!,That is a Box too';

      alert(str.replace(pattern, 'Tom')); //将Box替换成了Tom,返回的是替换后的字符串

      注释:如果是全局查找就会替换查找到的所有字符串

    4.4使用split拆分成字符串数组

      var pattern = / /ig;

      var str = 'This is a Box!,That is a Box too';

      alert(str.split(pattern)); //将空格拆开分组成数组,返回的是个查分后的数组

  5、RegExp对象的静态和动态属性

    5.1RegExp对象的静态属性

属  性

短  名

含  义

input

$_

返回当前被匹配的字符串

lastMatch

$&

返回最后一个匹配的字符串

lastParen

$+

返回最后一对圆括号内的匹配子串

leftContext

$`

返回最后一次匹配字符串的前面的子符串

multiline

$*

用于指定是否所有的表达式都用于多行的布尔值

rightContext

$'

在上次匹配之后的子串

    5.2使用静态属性时应该先创建好正则然后再通过RegExp对象来执行它的属性

    eg:

      var pattern = /(g)oogle/;

      var str = 'This is google';

      pattern.test(str);   

      alert(RegExp.input); //This is google!

      alert(RegExp.leftContext); //This is

      alert(RegExp.rightContext); //!

      alert(RegExp.lastMatch); //google

      alert(RegExp.lastParen); //返回最后一对圆括号内的匹配子串g

      alert(RegExp.multiline); //false

      注释:Opera不支持input、lastMatch、lastParen和multiline属性。IE不支持multiline属性。所有的属性可以使用短名来操作             RegExp.input可以改写成RegExp['$_'],依次类推。但RegExp.input比较特殊,它还可以写成RegExp.$_。

    5.3RegExp对象的实例属性

属  性

含  义

global

Boolean值,表示g是否已设置

ignoreCase

Boolean值,表示i是否已设置

lastIndex

整数,代表下次匹配将从哪里字符位置开始

multiline

Boolean值,表示m是否已设置

Source

正则表达式的源字符串形式

      5.4使用实例属性

        var pattern = /google/ig;

        alert(pattern.global); //true,创建正则时是否全局了

        alert(pattern.ignoreCase); //true,创建正则时是否忽略大小写

        alert(pattern.multiline); //false,创建正则时是否支持换行

        alert(pattern.lastIndex); //0,下次的匹配位置

        alert(pattern.source); //google,创建正则时正则表达式的源字符串

        var pattern = /google/g;

        var str = 'google google google';

        pattern.test(str); //google,匹配第一次

        alert(pattern.lastIndex); //6,第二次匹配的位

        注释:以上基本没什么用。并且lastIndex在获取下次匹配位置上IE和其他浏览器有偏差,主要表现在非全局匹配上。lastIndex还支持手动设置,直接赋值操作,了解就好。

  6、正则表达式中的元字符(正则表达式匹配模式的设置)

    6.1正则表达式元字符是包含特殊含义的字符。反斜杠后的元字符将失去其本身含义而具有特殊含义。

字符类:单个字符和数字

元字符/元符号

匹配情况

.

匹配除换行符外的任意字符

[a-z0-9]

匹配括号中的字符集中的任意字符

[^a-z0-9]

匹配任意不在括号中的字符集中的字符

\d

匹配数字

\D

匹配非数字,同[^0-9]相同

\w

匹配字母和数字及_

\W

匹配非字母和数字及_

[a-zA-Z]

匹配26个大小写英文字母

字符类:空白字符

元字符/元符号

匹配情况

\0

匹配null字符

\b

匹配字符串是否到达开口和末尾边界

\f

匹配进制字符

\n

匹配换行符

\r

匹配回车字符

\t

匹配制表符

\s

匹配空白字符、空格、制表符和换行符

\S

匹配非空白字符

字符类:锚字符

元字符/元符号

匹配情况

^

行首匹配

$

行尾匹配

\A

只有匹配字符串开始处

\b

匹配单词边界,词在[]内时无效

\B

匹配非单词边界

\G

匹配当前搜索的开始位置

\Z

匹配字符串结束处或行尾

\z

只匹配字符串结束处

字符类:重复字符

元字符/元符号

匹配情况

x?

匹配0个或1个x

x*

匹配0个或任意多个x

x+

匹配至少一个x

(xyz)+

匹配至少一个(xyz)

x{m,n}

匹配最少m个、最多n个x

x{m,}或x{,n}

匹配最少m个x或者是最多n个x

字符类:替代字符

元字符/元符号

匹配情况

this|where|logo

匹配this或where或logo中任意一个

字符类:记录字符

元字符/元符号

匹配情况(前天是必须要把字符串匹配出来)

(string)

用于反向引用的分组

\1或$1

匹配第一个分组中的内容

\2或$2

匹配第二个分组中的内容

\3或$3

匹配第三个分组中的内容

    6.2各种元字符的例子

      略

      5、使用锚元字符匹配*/

        var pattern = /^google$/; //^从开头匹配,$从结尾开始匹配

        var str = 'google';

        alert(pattern.test(str));

        var pattern = /goo\sgle/; //\s可以匹配到空格

        var str = 'goo gle';

        alert(pattern.test(str));

        var pattern = /google\b/; //\b可以匹配是否到了边界

        var str = 'google';

        alert(pattern.test(str));

      6、使用或模式匹配*/

        var pattern = /google|baidu|bing/; //匹配三种其中一种字符串

        var str = 'google';

        alert(pattern.test(str));

      7、使用分组模式匹配

        var pattern = /8(.*)8/; //获取8..8之间的任意字符

        var str = 'This is 8google8';

        str.match(pattern);

        alert(RegExp.$1); //得到第一个分组里的字符串内容

        var pattern = /8(.*)8/;

        var str = 'This is 8google8';

        var result = str.replace(pattern,'<strong>$1</strong>'); //得到替换的字符串输出,其中strong是字符串加粗

        document.write(result);//网页上输出result的内容

        var pattern = /(.*)\s(.*)/;

        var str = 'google baidu';

        var result = str.replace(pattern, '$2 $1'); //将两个分组的值替换输出

        document.write(result);

    6.3贪婪匹配和惰性匹配

贪  婪(最大范围的匹配)

惰  性(最小范围的匹配)

+

+?

?

??

*

*?

{n}

{n}?

{n,}

{n,}?

{n,m}

{n,m}?

      1、关于贪婪和惰性

        var pattern = /[a-z]+?/; //?号关闭了贪婪匹配,只替换了第一个

        var str = 'abcdefjhijklmnopqrstuvwxyz';

        var result = str.replace(pattern, 'xxx');

        alert(result);

        var pattern = /8(.+?)8/g; //禁止了贪婪,开启的全局

        var str = 'This is 8google8, That is 8google8, There is 8google8';

        var result = str.replace(pattern,'<strong>$1</strong>');

        document.write(result);

        var pattern = /8([^8]*)8/g; //另一种禁止贪婪

        var str = 'This is 8google8, That is 8google8, There is 8google8';

        var result = str.replace(pattern,'<strong>$1</strong>');

        document.write(result);

    2、使用exec返回数组  

        var pattern = /^[a-z]+\s[0-9]{4}$/i;

        var str = 'google 2012';

        alert(pattern.exec(str)); //返回整个字符串

        var pattern = /^[a-z]+/i; //只匹配字母

        var str = 'google 2012';

        alert(pattern.exec(str)); //返回google

      var pattern = /^([a-z]+)\s([0-9]{4})$/i; //使用分组

      var str = 'google 2012';

      alert(pattern.exec(str)[0]); //google 2012

      alert(pattern.exec(str)[1]); //google

      alert(pattern.exec(str)[2]); //2012

      var pattern = /(\d+)([a-z])/; //捕获性分组

      var str = '123abc';

      alert(pattern.exec(str));

      var pattern = /(\d+)(?:[a-z])/; //非捕获性分组,如果不想打印出分组的内容就在分组前加?:

      var str = '123abc';

      alert(pattern.exec(str));

      使用分组嵌套

      var pattern = /(A?(B?(C?)))/; //从外往内获取

      var str = 'ABC';

      alert(pattern.exec(str));

      使用前瞻捕获

      var pattern = /(goo(?=gle))/; //goo后面必须跟着gle才能返回goo,否则返回null

      var str = 'google';

      alert(pattern.exec(str));

      使用特殊字符匹配

      var pattern = /\.\[\/b\]/; //特殊字符,用\符号转义即可

      var str = '.[/b]';

      alert(pattern.test(str));

     使用换行模式

      var pattern = /^\d+/mg; //启用了换行模式

      var str = '1.baidu\n2.google\n3.bing';

      var result = str.replace(pattern, '#');

      alert(result);

三.常用的正则

  1.检查邮政编码

    var pattern = /[1-9][0-9]{5}/; //共6位数字,第一位不能为0

    var str = '224000';

    alert(pattern.test(str));

  2.检查文件压缩包

    var pattern = /[\w]+\.zip|rar|gz/; //\w表示所有数字和字母加下划线

    var str = '123.zip'; //\.表示匹配.,后面是一个选择

    alert(pattern.test(str));

  3.删除多余空格

    var pattern = /\s/g; //g必须全局,才能全部匹配

    var str = '111 222 333';

    var result = str.replace(pattern,''); //把空格匹配成无空格

    alert(result);

  4.删除首尾空格

    var pattern = /^\s+/; //强制首

    var str = '          goo  gle            ';

    var result = str.replace(pattern, '');

    pattern = /\s+$/; //强制尾

    result = result.replace(pattern, '');

    alert('|' + result + '|');

    var pattern = /^\s*(.+?)\s*$/; //使用了非贪婪捕获

    var str = '            google          ';

    alert('|' + pattern.exec(str)[1] + '|');

    var pattern = /^\s*(.+?)\s*$/;

    var str = '            google          ';

    alert('|' + str.replace(pattern, '$1') + '|'); //使用了分组获取

  5.简单的电子邮件验证

    var pattern = /^([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,4})$/;

    var str = 'yc60.com@gmail.com';

    alert(pattern.test(str));

    var pattern = /^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/;

    var str = 'yc60.com@gmail.com';

    alert(pattern.test(str));

      

javascript高级语法三的更多相关文章

  1. javaScript高级教程(三) javaScript不支持关联数组,只是语法上像关联数组

    1.在js中所有要素都是继承自Object对象的,任何对象都能通过obj['name'] = something的形式来添加属性,相当于obj.name=something. 之所以设计中括号这种存取 ...

  2. JavaScript高级用法三之浏览器对象

    综述 本篇的主要内容来自慕课网,内置对象,主要内容如下 1 window对象 2 JavaScript 计时器 3 计时器setInterval() 4 取消计时器clearInterval() 5 ...

  3. 一、JavaScript概述 二、JavaScript的语法 三、JavaScript的内置对象

    一.JavaScript的概述###<1>JavaScript的概念 又称ECMAScript,和java没有任何关系 嵌入在HTML元素中的 被浏览器解释运行的 一种脚本语言. ###& ...

  4. javascript 高级程序设计 三

    Sorry,前两张介绍的主题还是JavaScript,而第一章介绍了JavaScript和ECMAScript区别,所以前两章介绍的主题应该改为ECMAScript,但是 标题就不改了因为现在人们习惯 ...

  5. javascript高级语法学习

    可维护的代码意味着: 可读的 一致的 可预测的 看上去就像是同一个人写的 已记录 命名函数表达式 (function fn(){}) 他是表达式的原因是因为括号 ()是一个分组操作符,它的内部只能包含 ...

  6. javascript高级语法二

    一.BOM对象 1.什么是BOM对象? BOM是浏览器对象模型,核心对象就是window,所有浏览器都支持 window 对象.一个html文档对应一个window对象,主要功能是控制浏览器窗口的, ...

  7. JavaScript高级程序设计(三):基本概念:数据类型

    特别注意:ECMAScript是区分大小写的. 一.变量 1.ECMAScript的变量是松散型的.所谓松散型就是可以用来保存任何类型的数据.即每个变量仅仅是一个用于保存值的占位符而已.定义变量时要使 ...

  8. javascript高级语法

    一.JavaScript对象 1.js对象简介 1.1 在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量,在JavaScrip ...

  9. 《Javascript高级程序设计》阅读记录(三):第五章 上

    这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 这个系列,我会把阅读< ...

随机推荐

  1. Atitit. C#.net clr 2.0  4.0新特性

    Atitit. C#.net clr 2.0  4.0新特性 1. CLR内部结构1 2. CLR 版本发展史3 3. CLR 2.0 3 4. CLR 4 新特性 概览4 4.1.1.  托管与本地 ...

  2. Xilinx DDR3 IP核使用问题汇总(持续更新)和感悟

    一度因为DDR3的IP核使用而发狂. 后来因为解决问题,得一感悟.后面此贴会完整讲述ddr3 ip的使用.(XILINX K7) 感悟:对于有供应商支持的产品,遇到问题找官方的流程.按照官方的指导进行 ...

  3. JMX简单样例

    一:创建maven项目,在pom.xml里面增加例如以下依赖 <dependency> <groupId>com.sun.jdmk</groupId> <ar ...

  4. Spring+SpringMVC+MyBatis+Maven框架整合

    本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Sprin ...

  5. 【问题记录】MySQL中时间戳转日期格式和Java中时间戳转日期格式偶尔不一致

    背景: MySQL的某个字段存放着一些时间戳格式的时间. 问题描述: Java程序将MySQL中的时间戳字段取出来,在Java程序中转成yyyy-MM-dd HH:mm:ss格式的时候,偶尔会出现转化 ...

  6. nefu 118 n!后面有多少个0 算数基本定理,素数分解

    n!后面有多少个0 Time Limit 1000ms Memory Limit 65536K description 从输入中读取一个数n,求出n! 中末尾0的个数. input 输入有若干行.第一 ...

  7. Linux 后台任务

    1 我想把updatedb命令(用于重新建立整盘索引的命令)放在后台运行. # updatedb & [1] 23336 注释:在所要执行的命令后面加上空格,再加上&符号即可实现后台执 ...

  8. Openstack(Kilo)安装系列之环境准备(二)

    控制节点.网络节点.计算节点: 一.配置源 1.配置EPEL源 yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-rel ...

  9. apache+svn No installed service name 'Apache2' 【转载】

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://zys0597.blogbus.com/logs/32763815.html 问题:第一次在winxp下   安装apac ...

  10. iOS --有行距的图文混排

    UILabel *label = [[UILabel alloc]init]; label.numberOfLines = ; [self.view addSubview:label]; label. ...