正则表达式

一、简介
【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} 匹配 1 3 位的数字, (/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 ,会匹配 sing danc
           (?<= 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}$" , // 电话号码的函数 ( 包括验证国内区号 , 国际区号 , 分机号 )
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对象实例

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

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

参数说明:

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

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

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

varregObj =/pattern/[flags];

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

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

【5.2】RegExp的方法

【5.2.1】 test()

如前所述,该方法返回 true false
<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>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值