正则学习笔记

最近做东西频繁的用到正则这一块,所以自己又翻了翻以前的笔记和查看了正则三十分钟入门教程。重新整理了笔记,希望在以后的学习过程中便于查阅~~(注:以下例子非本人原创)

什么是正则表达式:在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。正则表达式是用于进行文本匹配的工具,即是在字符串里搜索/查找,即给定的字符串中,寻找与给定的正则表达式相匹配的部分。有可能字符串里面不止一个部分满足给定的正则表达式,这时每一个这样的部分被称为一个匹配。形容词性:一个字符串匹配一个表达式;动词性质:字符串里匹配正则表达式;名词性质:字符串中满足给定的正则表达式的一部分。

正则表达式的入门(常用的元字符):

\b代表单词的开头和结尾,即单词的分界处;(有的人在正则表达式里面叫它做元字符例如:\bhi\b.*\bLucy\b)

\d匹配任意的数字(一位);

\s匹配任意的空白符,包括空格,制表符(Tab,换行符,中文全角空格等;

\w匹配字母或数字或下划线或汉字等;

.匹配除了换行符以外的任意字符。

-不是元字符,只匹配本身——连字符。

例如:

0\d\d-\d\d\d\d\d\d\d\d(或者0\d{2}-\d{8})匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字(匹配区号为三位的中国电话号码)

^匹配你要查找的字符串的开始;

$匹配字符串的结束;(比如要求你填写的qq号码必须是512:^\d{5,12}$;数如果不使用^$的话,对于\d{5,12}而言,使用这样的方法就只能保证字符串里包含512连续位数字,而不是整个字符串就是512位数字。)

例子:

\(?0\d{2}[) -]?\d{8}

这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行一些分析吧:首先是一个转义字符\,(,它能出现0次或1(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})

字符转义

如果要查找元字符本身的话,如_.或者_*就出现问题,我们没有办法直接指定塔,因为他会被解释成别的意思,这时就是用\来取消这些字符的特殊意义,如:deerchao\.net匹配deerchao.net. C:\\Windows匹配C:\Windows

重复

*重复零次或更多次

+重复一次或更多次(数字)

?重复零次或一次

{n}重复n

{n,}重复n次或更多次

{n,m}重复nm

例如:Windows\d+匹配Windows后面跟一个或者更多的数字

字符类

查找数字、字母、空白都是很简单的,因为已经有了对应这些字符的集合的元字符,但是想要匹配没有预定义的元字符的字符集,你只需要在方括号列出如[a,e,i,o,u],[.?!]匹配标点符号(.?!)

例如:\(?0\d{2}[)-]?\d{8})

分枝条件:正则里面的分枝条件是的是有几种规则,如果满足其中任意一种规则都应该当成成立,忌用|把不通过的规则分割开来。例如:0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式匹配两种以连字号分隔的电话号码:单位区号八位本地号如(010-12345678,一种4位区号七位本地号(0943-2233445

分组:即重复多个字符,用小括号来指定子表达式,例如(\d{1,3}\.{3}\d{1,3})

反义:有时需要查找不属于某个能简单定义的字符类的字符,如:想查找除了数字以外,其它任意字符都行的情况这时就用到反义

\W匹配任意不是字母,数字,下划线,汉字的字符;

\S匹配任意不是空白符的字符;

\D匹配任意非数字的字符;

\B匹配不是单词开头的或结束的位置;

[^X]匹配除了X以外的任意字符;

[^aeiou]匹配除了aeiou这几个字母以外的任意字符;

后向引用:用小括号指定一个表达式,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中做进一步的处理,规则从左向右,以分组左括号为标志。例如:

\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。

零度断言:

(?=exp)叫做零宽度正预测先行断言,它断言自身出现的位置的后面螚匹配表达式exp,如:\b\w+(?=ing\b)匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找:imsinging while you are danceing时,它只匹配sing和dance.

(?<=exp)叫做零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配的表达式exp。如:(?<=\bre)\w+\b会匹配以re开头的单词的后半布恩(除了re部分),如查找reading a book ,匹配ading.

负向零宽度断言

我们只是想要确保某个字符没有出现,但并不想去匹配它是,如我们想要查找这样的单词——它里面出现了字母p,但是p后面跟的不是u,如:\b\w*q[^u]\w*\b

零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp.例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。

零宽度负回顾后发断言:\d{3}(?!\d)匹配这三位数字,而且这三位数字的后面不能是数字;(?<![a-z]\d{7}匹配前面不是小写字母的气味数字。

邮箱验证分析如下:

/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+$/;

       

      开始必须是一个或多个单词或数字或-,然后加上@,然后又是一个或者多个单词字符或者是-,然后是.和单词字符和-的组合,可以有一个或多个组合。

Js1=/^\d{5,12}$/  匹配5位到12位的qq号码

js2=/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/;首先()是一个计算单元,|表示或者,^表示开始,\表示转义,*表示0或者多个,.是任意的字符,整个句子的意思(字符@,然后中间0个或者多个字符),或者匹配两个点,或者匹配一个@一个点,或者是一个点一个@,或者以.开头。

Js3=/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;

+表示一个或者是多个,?表示0个或者是1个,[]是字符组,期内-表示范围,{里面是出现的个数},$结尾。整个句子的意思:一个或者是多个字符开始然后是字符@然后是0或一个[,然后是1个或者多个字母(大写小)数字歌字符.然后是.,然后是2到3个字母(大小写)或者1到3个数字,最后字符]结尾。

 

 

 

<title>正则表达</title>
<script type="text/javascript">
fChkMail=function(szMail){
var szReg=/^[A-Za-zd]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{2,5}$/;
/*var szReg=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;*/
var bChk=szReg.test(szMail);
return bChk;
}
</script>
</head>

<body>
<input type="text" id="Mail" value="" />
<input type="button" value="验证邮箱地址" οnclick="alert(fChkMail(document.getElementById('Mail').value));" />
<p>邮箱不能以 - _ .以及其它特殊字符开头和结束</p>
<p>邮箱域名结尾为2~5个字母,比如cn、com、name</p>

</body>

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值