正则表达式(javascript)学习总结
正则表达式在jquery、linux等随处可见,已经无孔不入。因此有必要对这个工具认真的学习一番。本着认真、严谨的态度,这次总结我花了近一个月的时间。但本文无任何创新之处,属一般性学习总结。
一、思考
1. 案例
通常系统管理员添加一个普通用户时,都有一些默认密码(如:123456),当新用户登录系统后需要自行修改密码为系统所要求的安全范围内的密码格式。如:密码位数要大于6位,必须是字母、特殊符号(如:下划线)、数字的组合形式。可以这样做:
Ø纯JavaScript实现
- function sumt(){
- var p_count=0;//是否是则为数字、字母、下划线的组合形式
- var pwd=document.getElementById("txtPWD").value;
- //长度验证
- if(pwd.length<7){
- alert('密码长度必须大于6位!');
- return;
- }
- //数字验证
- for(var i=0;i<pwd.length;i++){
- var p_char=pwd[i];
- if(p_char>='0'&&p_char<='9'){
- p_count++;
- break;
- }
- }
- //字母验证
- for(var i=0;i<pwd.length;i++){
- var p_char=pwd[i];
- if(p_char>='a'&&p_char<='z'){
- p_count++;
- break;
- }
- }
- //特殊符号验证
- if(pwd.indexOf('_')!=-1){
- p_count++;
- }
- if(p_count<3){
- alert('密码必须是数字、字母以及下划线组合形式!');
- }else{
- //提交
- }
- }
Ø正则实现
- //正则实现
- function sumt_reg(){
- var p_count=0;//是否是则为数字、字母、下划线的组合形式
- var val=document.getElementById("txtPWD").value;
- //长度验证
- if(val.length<7){
- alert('密码长度必须大于6位!');
- return;
- }
- var regex = /[0-9]/;//数字
- var regex1 = /[A-Za-z]/;//字母
- var regex2=/[_]/;//特殊符号
- if(val.match(regex)){
- p_count++;
- }
- if(val.match(regex1)){
- p_count++;
- }
- if(val.match(regex2)){
- p_count++;
- }
- if(p_count<3){
- alert('密码必须是数字、字母以及下划线组合形式!');
- }else{
- //提交
- }
- }
2.了解正则
Ø概念
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
Ø起源
正则表达式[1]的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究。美国新泽西州的Warren McCulloch和出生在美国底特律的Walter Pitts这两位神经生理方面的科学家,研究出了一种用数学方式来描述神经网络的新方法,他们创新地将神经系统中的神经元描述成了小而简单的自动控制元,从而作出了一项伟大的工作革新。
在1956 年,出生在被马克·吐温(Mark Twain)称为“美国最美丽的城市”之一的哈特福德市的一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。
二、公共方法
- function execReg(reg,str,msg){
- alert(msg+":"+reg.exec(str));
- //alert(msg+":"+str.match(reg));
- }
- var exampl_name;//实例名
- var reg;//正则表达式
- var str;//匹配字符
三、字符集合
字符集合 |
说明 |
. |
小数点可以匹配除了换行符(\n)以外的任意一个字符 |
\w |
可以匹配任何一个字母或者数字或者下划线 |
\W |
W大写,可以匹配任何一个字母或者数字或者下划线以外的字符 |
\s |
可以匹配空格、制表符、换页符等空白字符的其中任意一个 |
\S |
S大写,可以匹配任何一个空白字符以外的字符 |
\d |
可以匹配任何一个 0~9 数字字符 |
\D |
D大写,可以匹配任何一个非数字字符 |
1. example.1
小数点可以匹配除了换行符(\n)以外的任意一个字符
返回结果是l
- reg=/./;
- str='lixiuli';
- exampl_name="example.1";
- execReg(reg,str,exampl_name);
2. example.2
\w小写
可以匹配任何一个字母或者数字或者下划线
返回结果是_
- reg=/\w/;
- str='_lixiuli';
- exampl_name="example.2";
- execReg(reg,str,exampl_name);
3. example.3
\W大写,
可以匹配任何一个字母或者数字或者下划线以外的字符
返回结果是null
- reg=/\W/;
- str='_lixiuli';
- exampl_name="example.3";
- execReg(reg,str,exampl_name);
4. example.4
\s小写
可以匹配空格、制表符、换页符等空白字符的其中任意一个
返回结果是空格
- reg=/\s/;
- str=' lixiuli';
- exampl_name="example.4";
- execReg(reg,str,exampl_name);
5. example.5
\S 大写,
可以匹配任何一个空白字符以外的字符
返回结果是l
- reg=/\S/;
- str=' lixiuli';
- exampl_name="example.5";
- execReg(reg,str,exampl_name);
6. example.6
\d 小写
可以匹配任何一个 0~9 数字字符
返回结果是5
- reg=/\d/;
- str='lixiuli520';
- exampl_name="example.6";
- execReg(reg,str,exampl_name);
7.example.7
\D大写,
可以匹配任何一个非数字字符
返回结果是l
- reg=/\D/;
- str='lixiuli520';
- exampl_name="example.7";
- execReg(reg,str,exampl_name);
四、量词,贪婪模式
量词:贪婪模式 |
说明 |
{n} |
表达式固定重复n次,比如:"\w{2}" 相当于 "\w\w" |
{m, n} |
表达式尽可能重复n次,至少重复m次:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa" |
{m, } |
表达式尽可能的多匹配,至少重复m次:"\w\d{2,}"可以匹配 "a12","x456"... |
? |
表达式尽可能匹配1次,也可以不匹配,相当于 {0, 1} |
+ |
表达式尽可能的多匹配,至少匹配1次,相当于 {1, } |
* |
表达式尽可能的多匹配,最少可以不匹配,相当于 {0, } |
1.example.8
{n}
表达式固定重复n(此处是2)次
结果是ww
- reg=/w{2}/;
- str='wusongti_ww';
- exampl_name="example.8";
- execReg(reg,str,exampl_name);
2.example.9
{m,n}
表达式尽可能重复n(此处是3)次,
至少重复m(此处是1)次
结果是iii,而不是iiii
- reg=/i{1,3}/;
- str='liiiixiuli';
- exampl_name="example.9";
- execReg(reg,str,exampl_name);
3.example.10
{m,}
表达式尽可能的多匹配,
至少重复m(此处是2)次
结果是ii,而不是i
- reg=/i{2,}/;
- str='lixiulii';
- exampl_name="example.10";
- execReg(reg,str,exampl_name);
4.example.11
?
表达式尽可能匹配1次,
也可以不匹配
相当于 {0, 1}
结果是a,而不是null
- reg=/a?/;
- str='abbbccc';
- exampl_name="example.11";
- execReg(reg,str,exampl_name);
5. example.12
+
表达式尽可能的多匹配,
至少匹配1次,
相当于 {1, }
结果是ii,而不是i
- reg=/i+/;
- str='liixiuli';
- exampl_name="example.12";
- execReg(reg,str,exampl_name);
6.example.13
*
表达式尽可能的多匹配,
最少可以不匹配,
相当于 {0, }
结果为iii,而不是null
- reg=/i*/;
- str='iiilixiuli';
- exampl_name="example.13";
- execReg(reg,str,exampl_name);
五、量词,非贪婪模式
量词:非贪婪 |
说明 |
{m, n}? |
表达式尽量只匹配m次,最多重复n次。 |
{m, }? |
表达式尽量只匹配m次,最多可以匹配任意次。 |
?? |
表达式尽量不匹配,最多匹配1次,相当于 {0, 1}? |
+? |
表达式尽量只匹配1次,最多可匹配任意次,相当于 {1, }? |
*? |
表达式尽量不匹配,最多可匹配任意次,相当于 {0, }? |
1.example.14
{m, n}?
表达式尽量只匹配m次,
最多重复n次。
结果是i,而不是iiii
- reg=/i{1,3}?/;
- str='liiiixiuli';
- exampl_name="example.14";
- execReg(reg,str,exampl_name);
2.example.15
{m, }?
表达式尽量只匹配m次,
最多可以匹配任意次。
结果是ii,而不是iii
- reg=/i{2,}?/;
- str='lixiuliii';
- exampl_name="example.15";
- execReg(reg,str,exampl_name);
3.example.16
??
表达式尽量不匹配,
最多匹配1次,
相当于 {0, 1}?
结果是null,而不是a
+?
- reg=/a??/;
- str='abbbccc';
- exampl_name="example.16";
- execReg(reg,str,exampl_name);
4.example.17
表达式尽量只匹配1次,
最多可匹配任意次,
相当于 {1, }?
结果是i,而不是ii
- reg=/i+?/;
- str='liixiuli';
- exampl_name="example.17";
- execReg(reg,str,exampl_name);
5.example.18
*?
表达式尽量不匹配,
最多可匹配任意次,
相当于 {0, }?
结果为null,而不是iii
- reg=/i*?/;
- str='iiilixiuli';
- exampl_name="example.18";
- execReg(reg,str,exampl_name);
六、字符边界
字符边界 |
说明 |
^ |
当前位置必须是文本开始位置 |
$ |
当前位置必须是文本结束位置 |
\b |
当前位置的左右两侧,只能有一侧是字母数字或下划线 |
1.example.19
^
当前位置必须是文本开始位置
结果是null
- reg=/^i/;
- str='lixiuli';
- exampl_name="example.19";
- execReg(reg,str,exampl_name);
2.example.20
$
当前位置必须是文本结束位置
结果是i
- reg=/i$/;
- str='lixiuli';
- exampl_name="example.20";
- execReg(reg,str,exampl_name);
3.example.21
\b
当前位置的左右两侧,
只能有一侧是字母数字或下划线
结果是i
- reg=/i\b/;
- str='lixiuli';
- exampl_name="example.21";
- execReg(reg,str,exampl_name);
七、选择表达式
选择表达式 |
说明 |
| |
使用竖线 "|" 分隔多段表达式,整个表达式可匹配其中任意一段。 |
1.example.22
|
返回结果为x
- reg=/x|u/;
- str='li.xiu.li';
- exampl_name="example.22";
- execReg(reg,str,exampl_name);
八、自定义字符集合
自定义字符集合 |
说明 |
[ ] |
用中括号 [ ] 包含多个字符,可以匹配所包含的字符中的任意一个。同样,每次只能匹配其中一个。 |
[^] |
用中括号 [^ ] 包含多个字符,构成否定格式,可以匹配所包含的字符之外的任意一个字符。 |
1.example.23
[ ]
用中括号 [ ] 包含多个字符,
可以匹配所包含的字符中的任意一个。
同样,每次只能匹配其中一个。
结果是l
- reg=/[\da-zA-Z]/;
- str='lixiuli123LIXIULI';
- exampl_name="example.23";
- execReg(reg,str,exampl_name);
2.example.24
[^ ]
用中括号 [^ ] 包含多个字符,
构成否定格式,
可以匹配所包含的字符之外的任意一个字符。
结果是l
- reg=/[^i]/;
- str='lixiuli';
- exampl_name="example.24";
- execReg(reg,str,exampl_name);
九、分组
分组 |
说明 |
( ) |
用括号 ( ) 将其他表达式包含,可以使被包含的表达式组成一个整体,在被修饰匹配次数时,可作为整体被修饰。 另外,用括号包含的表达式,所匹配到的内容将单独作记录,匹配过程中或结束后可以被获取。 |
1.example.25
()
用括号 ( ) 将其他表达式包含,
可以使被包含的表达式组成一个整体,
在被修饰匹配次数时,
可作为整体被修饰。
另外,用括号包含的表达式,
所匹配到的内容将单独作记录,
匹配过程中或结束后可以被获取。
结果是lixiuliwusong,l,g
可以发现后面多出来一个l,g
这是因为括号的作用,原因在倒数第四行。
注:javascript不存在命名分组,我在这浪费了不少时间
- reg=/^(i|l).+(g|i)$/;//匹配开头是i或l结尾是g或i的所有字符(除了换行符)
- str='lixiuliwusong';
- exampl_name="example.25";
- execReg(reg,str,exampl_name);
十、反向引用
反向引用 |
说明 |
/(子正则表达式)\编号/ |
反向引用标识由正则表达式中的匹配组捕获的子字符串。每个反向引用都由一个编号或名称来标识,并通过“\编号”表示法进行引用。 |
1.example.26
由此引出反向引用的使用
此处返回"l"
- reg=/l/;//匹配l字母
- str='lixiuli';
- exampl_name="example.26";
- execReg(reg,str,exampl_name);
2.example.27
由此引出反向引用的使用
此处返回"lilu,li,llu"
lilu是整个正则匹配的结果
li是第一个括号匹配的结果
lu则是第二个括号匹配的结果
- reg=/([a-z]{2})([a-z]{2})/;//匹配两个连续字母*2,即匹配四个连续字母
- str='lilucy';
- exampl_name="example.27";
- execReg(reg,str,exampl_name);
3.example.28
反向引用
此处返回"null"
因为第一个括号li,第二个括号也匹配了li
反向引用\1则是拿第一个括号的匹配结果去匹配剩余的字符
而剩余的字符没有li,因此返回null
- reg=/([a-z]{2})([a-z]{2})\1/;
- str='lililucy';
- exampl_name="example.28";
- execReg(reg,str,exampl_name);
4.example.29
反向引用
此处返回"lililili,li,li"
lililili是整个正则匹配的结果
可将lililili分四部分来分析:li li li li
第一个li是第一个括号匹配到的
第二个li是第二个括号匹配到的
第三个li则是反向引用\1匹配到的
第四个li是反向引用\2匹配到的
第一个逗号后面的li是第一个括号匹配的结果
第二个逗号后面的li则是第二个括号匹配的结果
- reg=/([a-z]{2})([a-z]{2})\1\2/;//反向匹配两个括号的内容
- str='lililili';
- exampl_name="example.29";
- execReg(reg,str,exampl_name);
十一、非捕获性分组
非捕获性分组 |
说明 |
(?:子表达式) |
由于不是所有分组都能创建反向引用,有一种特别的分组称之为非捕获性分组,它是不会创建反向引用。反之,就是捕获性分组。要创建一个非捕获性分组,只要在分组的左括号的后面紧跟一个问号与冒号即可。 |
1.example.30
题目,移除所有标签,只留下innerText!
结果是:wusongti is a 大神
- var htmlText = "<p><a href='http://9080.iteye.com/'>wusongti</a> is a <em>大神</em></p>";
- reg=/<(?:.|\s)*?>/g;
- var text = htmlText.replace(reg, "");
- alert(text)
十二、其他
1.参考文献
Ø http://baike.baidu.com/view/94238.htm
本博文无任何创新之处,属于一般性自学总结。
正则表达式(javascript)学习总结.zip (46.2 KB)
正则表达式(javascript)学习总结的更多相关文章
- JavaScript:学习笔记(3)——正则表达式的应用
JavaScript:正则表达式的应用 应用正则表达式对象RegExp 创建正则表达式 JavaScript中使用RegExp对象来表述一个正则表达式.使用正则表达式之前首先要创建一个RegExp对象 ...
- WGZX:javaScript 学习心得--1
标签: javascriptiframedreamweaver浏览器htmltable 2008-09-11 10:50 1071人阅读 评论(0) 收藏 举报 分类: UI(21) 1,docu ...
- JavaScript学习--(智能社视频)
JavaScript学习,这是智能社官网上的JS视频,讲解的挺不错的,就是没有视频的demo,在视频中附上自己编写的一些demo... 下载地址:http://pan.baidu.com/s/1cPz ...
- javascript学习-类型判断
javascript学习-类型判断 1.类型判断的的武器 javascript中用于类型判断的武器基本上有以下几种: 严格相等===,用来判断null,undefined,true,false这种有限 ...
- JavaScript学习心得
javaScript十分的强大,所以自然而然学起来也是不易的,想要掌握它的核心,把它理解透更是不易的,但只要你能够静下心来,耐心的去钻研,学习,还是可以把它给学好的,加油吧! 下面是一些JavaScr ...
- javascript学习笔记(四) Number 数字类型
数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数 toExponential() 方法 用科学 ...
- JavaScript 引入方式 语言规范 语言基础 数据类型 常用方法 数组 if_else 比较运算符 for while 函数 函数的全局变量和局部变量 {Javascript学习}
Javascript学习 JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript ...
- JavaScript学习知识点归纳
JavaScript学习包括几大方面: 1.基础语法 2.JavaScript核心对象 3.DOM操作 4.BOM操作 5.正则表达式 6.AJAX 7.面向对象编程 以下依次为各版块相关内容==&g ...
- JavaScript学习总结-技巧、实用函数、简洁方法、编程细节
整理JavaScript方面的一些技巧,比较实用的函数,常见功能实现方法,仅作参考 变量转换 var myVar = "3.14159", str = ""+ ...
- javascript学习的思维导图
今天逛师父的博客园,发现了好东西~~~~我给偷过来了~~~那就是javascript学习的思维导图,比自己整理更快速. 思维导图小tips: 思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ...
随机推荐
- ajax.abort 终止AJAX请求
$(document).ready(function () { var ajax; $('#choice').change(function() ...
- 代理的使用 一(helloworld级别)
个人理解(估计,半年一年后,在看到这篇文章的时候,会觉得,当时真的弱爆了) 当我们自定义view的时候,比如说view上面有几个按钮,那么我们在别的地方使用这个view的时候,怎么来处理这些点击事件呢 ...
- C++实用数据结构:二叉索引树
看下面这个问题(动态连续和查询): 有一个数组A(长度为n),要求进行两种操作: add(i,x):让Ai增大x: query(a,b):询问Aa+Aa+1+...+Ab的和: 若进行模拟,则每次qu ...
- CentOS7 安装LAMP环境
1.使用yum安装 yum -y install httpd mysql mysql-server php php-mysql postgresql postgresql-server php-pos ...
- 鸟哥笔记:linux系统日志文件介绍
简单的说日志文件就是记录系统活动信息的几个文件,例如:何时.何地(来源ip).何人(什么服务名称).做了什么操作.换句话说就是:记录系统在什么时候由哪个进程做了什么样的行为时,发生了什么事件等. 日志 ...
- [PHP]MemCached高级缓存
Memcache Win32 的安装下载:Memcache Win32 [www.php100.com] [www.jehiah.cz/projects/memcached-win32/] 1.解 ...
- 上传头像,界面无跳转,php+js
上传头像,界面无跳转的方式很多,我用的是加个iframe那种.下面直接上代码. html: //route 为后端接口//upload/avatar 为上传的头像的保存地址//imgurl=/uplo ...
- lua中的时间函数
-- 获取当前的格林尼治时间print(os.time())-- 获取当前时间的字符串表示,形如:11/28/08 10:28:37print(os.date())-- 获取当前日期的字符串表示,形如 ...
- Unity3d Shader开发(三)Pass(Texturing )
纹理在基本的顶点光照被计算后被应用.在着色器中通过SetTexture 命令来完成. SetTexture 命令在片面程序被使用时不会生效:这种模式下像素操作被完全描述在着色器中. 材质贴图可以用 ...
- Lucene基础(三)-- 中文分词及高亮显示
Lucene分词器及高亮 分词器 在lucene中我们按照分词方式把文档进行索引,不同的分词器索引的效果不太一样,之前的例子使用的都是标准分词器,对于英文的效果很好,但是中文分词效果就不怎么样,他会按 ...