正则表达式

来源:互联网 发布:linux解压缩tar.bz2 编辑:程序博客网 时间:2024/04/29 17:15
一、简介
【1.1】正则表达式简介
            正则表达式(Regularexpression,简写为Regexes)是一种用来操作和检验字符串数据的强大工具。它相当与一串特殊的字符,用它可以转换成算法,对文本进行匹配等操作。

【1.2】正则表达式的作用

            1、验证字符的代码非常繁琐冗长。有了正则表达式,验证程序的代码变得简洁而更强大,代码运行的速度更快。如:可以用表达式验证填写的电子邮件地址格式是否正确等。
            2、替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
            3、根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
二、正则表达式的基础语法

【2.1】    匹配不同类型的字符

【2.2】    定位控制字符

【2.3】    指定重复字符

【2.4】特殊控制类

|    :指定字符替换,即该位置可以是|两边的任一个表达式

【2.5】特殊字符转义序列

三、正则表达式的高级应用

【3.1】分组

           重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作
(/d{1,3}/.){3}/d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:/d{1,3}匹配13位的数字,(/d{1,3}/.}{3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(/d{1,3})
           不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址(IP地址中每个数字都不能大于255)。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?)
【3.2】后向引用
          使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。例如/1代表分组1匹配的文本

实例:
         【/b(/w+)/b/s+/1/b】可以用来匹配重复的单词,像gogo, kitty kitty【/b(/w+)/b】匹配一个单词,【/s+】匹配1或多个空白符,【/1】表示前面匹配的那个单词。
你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:
(?<Word>/w+)(或者把尖括号换成'也行:(?'Word'/w+)),这样就把/w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用/k<Word>,所以上一个例子也可以写成这样:/b(?<Word>/w+)/b/s+/k<Word>/b

【3.3】零宽断言

          接下来的几个方法是用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像/b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(断言),因此被称为零宽断言
           (?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如/b/w+(?=ing/b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'msinging while you are dancing ,会匹配singdanc
           (?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=/bre)/w+/b会匹配以re开头的单词的后半部分,例如在查找reading a book 时,它匹配ading
           假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=/d)/d{3})*/b,用它对1234567890进行查找时结果是234567890
下面这个例子同时使用了这两种断言:
(?<=/s)/d+(?=/s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)
【3.4】高级应用总结
使用小括号有很多特定用途的语法总结如下:
捕获
(exp)匹配exp,并捕获文本到自动命名的组里
(?<name>exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:
exp)   匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置
注释
(?#comment)    这种类型的组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

四、常用的正则表达式

decmal:"^([+-]?)\\d*\\.\\d+$",//浮点数

decmal1:"^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$",//正浮点数

decmal2:"^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$",//负浮点数

decmal3:"^-?([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0)$",//浮点数

decmal4:"^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$",//非负浮点数(正浮点数+ 0

decmal5:"^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$",//非正浮点数(负浮点数+ 0

intege:"^-?[1-9]\\d*$",//整数

intege1:"^[1-9]\\d*$",//正整数

intege2:"^-[1-9]\\d*$",//负整数

num:"^([+-]?)\\d*\\.?\\d+$",//数字

num1:"^[1-9]\\d*|0$",//正数(正整数+ 0

num2:"^-[1-9]\\d*|0$",//负数(负整数+ 0

ascii:"^[\\x00-\\xFF]+$",//ACSII字符

chinese:"^[\\u4e00-\\u9fa5]+$",//仅中文

color:"^[a-fA-F0-9]{6}$",//颜色

date:"^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$",//日期

email:"^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$",//邮件

idcard:"^[1-9]([0-9]{14}|[0-9]{17})$",//身份证

ip4:"^(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)$",//ip地址

letter:"^[A-Za-z]+$",//字母

letter_l:"^[a-z]+$",//小写字母

letter_u:"^[A-Z]+$",//大写字母

mobile:"^0?(13|15|18)[0-9]{9}$",//手机
mobile2:"^(1[3458])[0-9]{9}|((\+852|00852)[9|8|6|5])[0-9]{7}$"//支持香港手机号
tel1:"^(0[0-9]{2,3}\\-)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?$"//固定电话
tel2:"^((0[0-9]{2,3}\-)?[2-9][0-9]{6,7}|((00852|\+852)\-)?([2-3][0-9]{7}))+(\-[0-9]{1,4})?$"//固定电话(支持香港固话)
notempty:"^\\S+$",//非空
password:"^.*[A-Za-z0-9\\w_-]+.*$",//密码
fullNumber:"^[0-9]+$",//数字
picture:"(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$",//图片
qq:"^[1-9]*[1-9][0-9]*$",//QQ号码
rar:"(.*)\\.(rar|zip|7zip|tgz)$",//压缩文件
tel:"^[0-9\-()()]{7,18}$",//电话号码的函数(包括验证国内区号,国际区号,分机号)
url:"^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$",//url
username:"^[A-Za-z0-9_\\-\\u4e00-\\u9fa5]+$",//用户名
deptname:"^[A-Za-z0-9_()()\\-\\u4e00-\\u9fa5]+$",//单位名
zipcode:"^\\d{6}$",//邮编realname:"^[A-Za-z\\u4e00-\\u9fa5]+$",//真实姓名
companyname:"^[A-Za-z0-9_()()\\-\\u4e00-\\u9fa5]+$",
companyaddr:"^[A-Za-z0-9_()()\\#\\-\\u4e00-\\u9fa5]+$",
companysite:"^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&#=]*)?$"

五、JS中的RegExp对象

【5.1】创建RegExp对象实例

}RegExpJavaScript提供的一个对象,用来完成有关正则表达式的操作和功能,每一条正则表达式模式对应一个RegExp实例。JavaScript使用RegExp对象封装与正则表达式相关的功能和操作,每一个该对象的实例对应着一条正则表达式。和其他对象一样,在使用之前必须取得其引用或新建一个对象实例。创建一个RegExp实例语法如下:

varregObj =newRegExp(“pattern” [,” flags ”] );

参数说明:

pattern:必选项,正则表达式的字符串。

flags:可选项,是一些标志组合。

在标志组合中,“g”表示全局标志。设定时将搜索整个字符串,以找匹配的内容,每一次新的探索都从RegExp对象的lastIndex标记的字符起,否则只搜索到第一个匹配的内容。“i”表示忽略大小写标志,若设置该项,则在搜索匹配项时忽略大小写,否则将区别大小写。以上所述是创建正则表达式对象的方式之一,另一种创建方式如下:

varregObj =/pattern/[flags];

参数的意义和第一种方式一样,但这种方式不能用引号将patternflags括起来。正则表达式的使用非常简单,只要用一个test方法就行了,如下所示。

regObj.test(string );//验证通过则返回true,不通过返回false

【5.2】RegExp的方法

【5.2.1】 test()

如前所述,该方法返回truefalse
<script language="javascript">

var filter = /一枪爆头/g;//将受限制的词句组成正则表达式

var said = "他被人一枪爆头了";//将接受检查的语句

if( filter.test( said ) )//如果被检查语句中存在受限词句

{

alert( "该语句中有限制级词语,系统已经过滤!" );//显示警告

  }

  else  // 否则

  {

  alert( said );  //输出原话

  }

12  </script>

【5.2.2】exec()方法

该方法执行匹配操作,如果找到匹配则继续找下一项。找不到匹配返回null

<script language="javascript">

varreg = /.o./g;//寻找字符o前后接任意字符组成的有三个字符的字符串

varstr = "How are you?"//源串

  var result = new Array();//用于接收结果

  while( reg.exec(str) != null )//执行匹配操作,如果找到匹配则继续找下一项

  {

  result.push(RegExp.lastMatch );//添加结果

  }

  alert( result );  // 输出找到的匹配项

  </script>

【5.2.3】match方法

该方法查找匹配,返回一个数组。

  <script language="javascript">

  varshowStr="";//定义一个变量,并赋空值

  varstr = "this word isOKOKOKOKokokokok!!!";//给变量赋初值

  varsearchStr = /(OK){2}/gi;//分组的正则表达式

  var result=str.match(searchStr);//查找匹配

  for (var i = 0; i <result.length; i++)//循环访问arrdata对象

  {

      showStr+=result[i]+"\n";//显示信息

  }

  alert("一共有"+result.length+"组匹配\n"+showStr);//显示最后匹配的结果

  </script>

原创粉丝点击