`
chaoyi
  • 浏览: 292091 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

第十章:正则表达式

阅读更多

学习要点:
1.什么是正则表达式
2.创建正则表达式
3.获取控制
4.常用的正则

假设用户需要在 HTML 表单中填写姓名、地址、出生日期等。那么在将表单提交到服务器进一步处理前,JavaScript 程序会检查表单以确认用户确实输入了信息并且这些信息是符合要求的。

一.什么是正则表达式
正则表达式(regular expression)是一个描述字符模式的对象。ECMAScript 的 RegExp 类表示正则表达式, 而 String 和 RegExp 都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。
正则表达式主要用来验证客户端的输入数据。 用户填写完表单单击按钮之后, 表单就会被发送到服务器,在服务器端通常会用 PHP、 ASP.NET 等服务器脚本对其进行进一步处理。
因为客户端验证,可以节约大量的服务器端的系统资源,并且提供更好的用户体验。

 

二.创建正则表达式
创建正则表达式和创建字符串类似, 创建正则表达式提供了两种方法, 一种是采用 new 运算符,另一个是采用字面量方式。
1.两种创建方式

var box = new RegExp('box'); //第一个参数字符串
var box = new RegExp('box', 'ig'); //第二个参数可选模式修饰符

 

模式修饰符的可选参数



 

var box = /box/; //直接用两个反斜杠
var box = /box/ig; //在第二个斜杠后面加上模式修饰符

 
2.测试正则表达式
RegExp 对象包含两个方法: test()和 exec(), 功能基本相似, 用于测试字符串匹配。 test()方法在字符串中查找是否存在指定的正则表达式并返回布尔值, 如果存在则返回 true, 不存在则返回 false。exec()方法也用于在字符串中查找指定正则表达式,如果 exec()方法执行成功,则返回包含该查找字符串的相关信息数组。如果执行失败,则返回 null。

RegExp 对象的方法

 

 

/*使用 new 运算符的 test 方法示例*/

var pattern = new RegExp('box', 'i'); //创建正则模式,不区分大小写
var str = 'This is a Box!'; //创建要比对的字符串
alert(pattern.test(str)); //通过 test()方法验证是否匹配

 
/*使用字面量方式的 test 方法示例*/

var pattern = /box/i; //创建正则模式,不区分大小写
var str = 'This is a Box!';
alert(pattern.test(str));

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

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

 
/*使用 exec 返回匹配数组*/

var pattern = /box/i;
var str = 'This is a Box!';
alert(pattern.exec(str)); //匹配了返回数组,否则返回 null

 
PS:exec 方法还有其他具体应用,我们在获取控制学完后再看。
3.使用字符串的正则表达式方法
除了 test()和 exec()方法,String 对象也提供了 4 个使用正则表达式的方法。


String 对象中的正则表达式方法



 

/*使用 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); //获取数组的长度

 
/*使用 search 来查找匹配数据*/

var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too';
alert(str.search(pattern)); //查找到返回位置,否则返回-1

 
PS:因为 search 方法查找到即返回,也就是说无需 g 全局
/*使用 replace 替换匹配到的数据*/

var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too';

 
alert(str.replace(pattern, 'Tom')); //将 Box 替换成了 Tom
/*使用 split 拆分成字符串数组*/

var pattern = / /ig;
var str = 'This is a Box!,That is a Box too';
alert(str.split(pattern)); //将空格拆开分组成数组

 
RegExp 对象的静态属性



 

/*使用静态属性*/

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

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


RegExp 对象的实例属性



 

/*使用实例属性*/

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,第二次匹配的位

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

 

三.获取控制
正则表达式元字符是包含特殊含义的字符。 它们有一些特殊功能, 可以控制匹配模式的方式。反斜杠后的元字符将失去其特殊含义。


字符类:单个字符和数字



 

字符类:空白字符



 

字符类:锚字符



 

字符类:重复字符



 

字符类:替代字符



 

字符类:记录字符



 

 

/*使用点元字符*/

var pattern = /g..gle/; //.匹配一个任意字符
var str = 'google';
alert(pattern.test(str));

 
/*重复匹配*/

var pattern = /g.*gle/; //.匹配 0 个一个或多个
var str = 'google'; //*,?,+,{n,m}
alert(pattern.test(str));

 
/*使用字符类匹配*/

var pattern = /g[a-zA-Z_]*gle/; //[a-z]*表示任意个 a-z 中的字符
var str = 'google';
alert(pattern.test(str));
var pattern = /g[^0-9]*gle/; //[^0-9]*表示任意个非 0-9 的字符
var str = 'google';
alert(pattern.test(str));
var pattern = /[a-z][A-Z]+/; //[A-Z]+表示 A-Z 一次或多次
var str = 'gOOGLE';
alert(pattern.test(str));

 
/*使用元符号匹配*/

var pattern = /g\w*gle/; //\w*匹配任意多个所有字母数字_
var str = 'google';
alert(pattern.test(str));
var pattern = /google\d*/; //\d*匹配任意多个数字
var str = 'google444';
alert(pattern.test(str));
var pattern = /\D{7,}/; //\D{7,}匹配至少 7 个非数字
var str = 'google8';
alert(pattern.test(str));

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

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));

 
/*使用或模式匹配*/

var pattern = /google|baidu|bing/; //匹配三种其中一种字符串
var str = 'google';
alert(pattern.test(str));

 
/*使用分组模式匹配*/

var pattern = /(google){4,8}/; //匹配分组里的字符串 4-8 次
var str = 'googlegoogle';
alert(pattern.test(str));
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>'); //得到替换的字符串输出
document.write(result);
var pattern = /(.*)\s(.*)/;
var str = 'google baidu';
var result = str.replace(pattern, '$2 $1'); //将两个分组的值替换输出
document.write(result);



  


/*关于贪婪和惰性*/

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);

 
/*使用 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 才能捕获
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/; //\d\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 = 'chaoyi77@163.com';
alert(pattern.test(str));
var pattern = /^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/;
var str = 'chaoyi77@163.com';
alert(pattern.test(str));

 

  • 大小: 19.4 KB
  • 大小: 13.6 KB
  • 大小: 16.9 KB
  • 大小: 27.5 KB
  • 大小: 36.5 KB
  • 大小: 30.9 KB
  • 大小: 37.5 KB
  • 大小: 32.5 KB
  • 大小: 23.4 KB
  • 大小: 11.5 KB
  • 大小: 10 KB
  • 大小: 35.8 KB
  • 大小: 15.9 KB
分享到:
评论

相关推荐

    java各知识点详细总结(毕向东笔记整理)

    第十章:网络编程 284 -309309309 第十一章:反射机制 310 -315315315 第十二章:正则表达式 315 -322322322 第十三章:HTMLHTMLHTMLHTML语言 322 -335 335 335 335 335 335 335 335 335 第十四章:CSS CSS语言 ...

    毕向东 Java 课件

    第十章:网络编程 284-309 第十一章:反射机制 310-315 第十二章:正则表达式 315-322 第十三章:HTML语言 322-335 第十四章:CSS语言 335-341 第十五章:JavaScript 语言 341-375 第十六章:DOM 375-429

    Java基础详解(入门级)

    第十章:网络编程 284-309 第十一章:反射机制 310-315 第十二章:正则表达式 315-322 第十三章:HTML 语言 322-335 第十四章:CSS 语言 335-341 第十五章:JavaScript 语言 341-375 第十六章:DOM 375-429

    Java基础课堂笔记

    Java基础笔记, 第一章:编程基础 第二章:数组 第三章:面向对象程序开发 第四章:异常机制 第五章:多线程技术 第六章:常用类API 第七章:集合框架(容器)+其他类对象使用 第八章:IO流 第九章:GUI编程 第十章:...

    oracle11g

    oracle11g 第一部分:SQL语言基础 第一章:关系型与非关系型数据库 第二章:SQL的基本函数 第三章:SQL的数据类型 第四章、WHERE子句中常用的运算符 第五章:分组函数 ...第二十二章:正则表达式

    很经典的XML入门教程

    第十章:使用IE5 浏览XML 文件 第十一章:一个很典型的XML 文件例子 第十二章:格式化XML(一) 第十三章:格式化XML(二) 第十四章:XML 的典型运用(一) 第十五章:XML 的运用(二) 第十六章:XML 的运用(三)...

    XML初学入门教程(pdf)

    9 第七章:XML DOM 11 第八章:XSL - The Style Sheet Language of XML(XML的样式表语言) 12 第九章:XML Behaviors - 新的DHTML 15 第十章:使用IE5浏览XML文件 17 第十一章:一个很典型的XML文件...

    JavaScript权威指南

    第十章 使用正则表达式的模式匹配 第十一章 JavaScript的更多主题 第二部分 客户JavaScript 第十二章 Web浏览器中的JavaScript 第十三章 窗口和框架 第十四章 Document对象 第十五章 表单和表单元素 第十六章...

    PHP程序设计思维导图

    原创整理 PHP程序设计的思维... 内容包含: ...第二章:标记、注释 第三章:数据类型 第四章:常量和变量 第五章:运算符 第六章:表达式和函数 第七章:流程控制语句 第八章:字符串操作 第九章:正则表达式 第十章:数组

    python爬虫修改版.pdf

    第三章 正则表达式。 第四章 XPATH 提取数据。 第五章 动态 HTML 处理。 第六章 多线程爬虫实现。 第七章:Scrapy 框架初步。 第八章:增量爬虫。 第九章:验证码识别。 第十章 MongoDB 数据库。 第十一章 爬虫项目...

    C#网络应用编程基础

    第七章 正则表达式与Internet操作 第八章 ADO.NET与SQLServer 第九章 二维 图形图像处理 第十章 基于组建的开发技术 第十一章 网站建设与网页制作 第十二章 ASP.NET Web服务器控件 第十三章 ASP.NET Web应用程序开发...

    Perl语言入门(第五版-中文版).pdf

    第十章其他控制结构 unless控制结构 until控制结构 条件修饰词 裸块控制结构 elsif子句 自增和自减 for控制结构 循环控制 三目操作符?: 逻辑操作符 习题 第十一章perl模块 寻找模块 安装模块 使用...

    web开发基础教程

    控制语句 第九章 Javascript_函数.ppt 第十章 Javascript_核心对象.ppt 第十一章 Javascript_正则表达式.ppt 第十二章 Javascript_事件处理.ppt 第十三章 Javascript_DOM模型.ppt 第十四章 JavaScript_Window对象....

    Python编程笔记 Python开发知识总结整理 Python核心笔记 共51页.pdf

    第十章 错误和异常 第十一章 函数和函数式编程 第十二章 模块 第十三章 面向对象编程 第十四章 执行环境 第2部分 高级主题 第十五章 正则表达式 第十六章 网络编程 第十七章 网络客户端编程 第十八章 多...

    Perl 语言入门 第六版

    目录 ...第十章其他控制结构 第十一章Perl模块 第十二章文件测试 第十三章目录操作 第十四章字符串与排序 第十五章智能匹配与given—when结构 第十六章进程管理 第十七章高级Perl技巧 附录

    Python基础理论核心笔记汇总

    第十章 错误和异常 23 第十一章 函数和函数式编程 25 第十二章 模块 27 第十三章 面向对象编程 29 第十四章 执行环境 32 第 2 部分 高级主题 34 第十五章 正则表达式 34 第十六章 网络编程 37 第十七章 网络...

    Perl最佳实践(中文版).pdf [共两部分 part1]

    第十二章 正则表达式 第十三章 错误处理 第十四章 命令行处理 第十五章 对象 第十六章 类层次 第十七章 模块 第十八章 测试和调试 第十九章 其他主题 附录一 Perl基本的最佳实践 附录二 Perl最佳实践 附录三 编辑器...

    Perl最佳实践(中文版).pdf [共两部分 part2]

    第十二章 正则表达式 第十三章 错误处理 第十四章 命令行处理 第十五章 对象 第十六章 类层次 第十七章 模块 第十八章 测试和调试 第十九章 其他主题 附录一 Perl基本的最佳实践 附录二 Perl最佳实践 附录三 编辑器...

    JavaScript语言精粹

    第一章 精华 第二章 语法 第三章 对象 第四章 函数 第五章 继承 第六章 数组 第七章 正则表达式 第八章 方法 第九章 代码风格 第十章 优美的特性

Global site tag (gtag.js) - Google Analytics