奋斗吧!我们为之奋斗的正则表达式

      今天学到一个新知识,也就是正则表达式,这个东西非常有意思,而且还非常强大,在没学正则表达式之前,对于一些复杂的字符串判断,也许会要你看的都头痛的代码,自从

接触到正则后,你会发现他的强大之处,可能原来的好多代码,用到正则可能一两行就搞定了,话不多说,我相信大家一定非常期待吧!

   我推荐大家在学习的正则的时候,不要心浮气躁,一定要沉住气,一定要坚持多看,多练,一个知识点不是一个人能一下学会的,除非你是天才,成功是留给哪些能坚持住的人。

一.正则表达式是什么

    正则表达式是一个描述字符模式的对象,它是有一些特殊的符号组成,这些符号和在sql server中学过的通配符一样,其组成的字符模式用来匹配各种表达式,简单的理解就是一个自定义字符串是否和你写的正则表达式匹配。还有一种说法就是:正则表达式就是记录文本规则的代码。

     通过上面的一些解释我相信大家对正则应该有了一个概念上的了解。下面来看看正则表达式用到的对象是什么?

  我们都知道比如你想获取时间有Date对象,如果想获取随机数,那么就有对象的Math对象,所以呢正则表达式也有自己的对象:RegExp

1.RegExp对象:

  RegExp对象是Regular Expression的缩写,他是对字符串执行模式匹配的强大工具。

2.如何去定义正则表达式:

   一般定义正则表达式有两种构造方式,一种是普通方式,另一种是构造函数的方式。

2.1普通方式

语法:

var reg=/表达式/附加参数

表达式:一个字符串代表某种规则,其中可以使用某些特定的字符来代表特殊的规则。

附加参数:用来看扩展表达式的含义,它主要有3个参数:

    01.g:代表可以进行全局匹配。

    02. i:代表不区分大小写匹配。

    03.m:代表可以进行多行匹配。

  上面3个参数可以任意组合,代表复合含义,当然也可以不加参数,随情况而论。

eg:

   var reg=/hi/;   这是一个较为基础的正则表达式,如果有一个字符串中有”hi aabbcc“,那么他就能匹配这个正则。

   var reg=/hi/i; 如果有一个字符串中有”HI aabbcc“,那么他也能匹配这个正则,应为这条正则已经在后面加了一个g代表忽略大小写进行匹配。

2.2构造函数的方式

   语法:

 var reg=new RegExp("表达式","附加参数");

我们可以把上面的形式写成:

   var reg=new RegExp("hi");

   var reg=new RegExp("hi","i"”);

注:普通方式中的表达式必须是一个常量字符串构造函数中的表达式可以是常量可以是字符串,也可以是Js中的变量。

3.表达式的模式:

   表达式的模式一般分为2种,一种是简单模式,一种是复合模式。

1.简单模式:通过普通的字符的组合来表达的模式。

2.复合模式:通过通配符来表达的模式,一般用来表单校验。

4.RegExp对象的常用方法和属性:

   test方法

语法格式为test(str)。该方法检查一个字符串中是否存在创建RegExp对象实例时所指定的表达式模式,如果存在就返回True,否则返回False。如果找到匹配项,则会更新RegExp对象中的有关静态属性,以反映匹配情况。

  eg:

<html>

<head>

<title>创建正则表达式 </title>

<script language = "JavaScript">

       var myString="这是第一个正则表达式的例子";

       var myregex = new RegExp("一个");   // 创建正则表达式

       if (myregex.test(myString)){

            document.write("找到了指定的模式!");

       }

       else{

            document.write("未找到指定的模式。");

       }

</script>

</head><body></body>

</html>

    exec方法

语法格式为exec(str)

该方法使用创建RegExp对象实例时所指定的表达式模式对一个字符串进行搜索,并返回一个包含搜索结果的数组。

      如果为正则表达式设置了全局标志(g),可以通过多次调用exec和test方法在字符串中进行连续搜索,每次都是从RegExp对象的lastIndex属性值(re.lastIndex)指定的位置开始搜索字符串。

      如果没有设置全局标志(g),则exec和test方法忽略RegExp对象的lastIndex属性值,从字符串的起始位置开始搜索。

如果exec方法没有找到匹配,返回值为null;如果找到匹配,则返回一个数组,并更新RegExp对象中有关静态属性以反映匹配情况。返回数组中的元素0包含了完整的匹配结果,而元素1~n依次是表达式模式中定义的各个子匹配的结果。

exec方法返回的数组有2个属性,分别是input、index

      rst.input属性是整个被搜索的字符串。

      rst.index属性是指匹配在整个被搜索字符串中的位置。

      re.lastIndex属性是指匹配的子字符串的最后一个字符的下一个字符位置。

eg:

<html>

<head>

<title>exec()方法应用</title>

<script language = "JavaScript">

    var myString="aaa 111 bbb 222 ccc 1111 222ddd";

    var regex = /111/;     //创建正则表达式对象

    var array=regex.exec(myString);

    if (array){

          var str="找到了匹配子串!"+"\n返回数组的值为:"+array+"\n数组元素个数:"

                          +array.length+"\n被搜索的字符串为:"+array.input

                          +"\n匹配子串的开始位置为:"+array.index

                          +"\n匹配子串后面第一个字符的位置为:"+regex.lastIndex;

                  alert(str);

          }

          else{

                  alert("未找到匹配子串!!");

          }

</script>

<body></body>

</html>

 常用属性

 

具体用法大家可以去这里看一下:https://msdn.microsoft.com/zh-cn/library/dt8b909y(v=vs.90).aspx

   二.元字符

现在你已经知道几个很有用的元字符了,如\b,.,*,还有\d.正则表达式里还有更多的元字符,比如\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。\w匹配字母或数字或下划线或汉字等。

对中文/汉字的特殊处理是由.Net提供的正则表达式引擎支持的,其它环境下的具体情况请查看相关文档。

下面来看看更多的例子:

\ba\w*\b匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)。

好吧,现在我们说说正则表达式里的单词是什么意思吧:就是不少于一个的连续的\w。不错,这与学习英文时要背的成千上万个同名的东西的确关系不大 :)

\d+匹配1个或更多连续的数字。这里的+是和*类似的元字符,不同的是*匹配重复任意次(可能是0次),而+则匹配重复1次或更多次。

\b\w{6}\b 匹配刚好6个字符的单词。

表1.常用的元字符
代码说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

正则表达式引擎通常会提供一个“测试指定的字符串是否匹配一个正则表达式”的方法,如JavaScript里的RegExp.test()方法或.NET里的Regex.IsMatch()方法。这里的匹配是指是字符串里有没有符合表达式规则的部分。如果不使用^和$的话,对于\d{5,12}而言,使用这样的方法就只能保证字符串里包含5到12连续位数字,而不是整个字符串就是5到12位数字。

元字符^(和数字6在同一个键位上的符号)和$都匹配一个位置,这和\b有点类似。^匹配你要用来查找的字符串的开头,$匹配结尾。这两个代码在验证输入的内容时非常有用,比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$。

这里的{5,12}和前面介绍过的{2}是类似的,只不过{2}匹配只能不多不少重复2次,{5,12}则是重复的次数不能少于5次,不能多于12次,否则都不匹配。

因为使用了^和$,所以输入的整个字符串都要用来和\d{5,12}来匹配,也就是说整个输入必须是5到12个数字,因此如果输入的QQ号能匹配这个正则表达式的话,那就符合要求了。

和忽略大小写的选项类似,有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项,^和$的意义就变成了匹配行的开始处和结束处。

    三.字符转义

如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\.

例如:deerchao\.net匹配deerchao.net,C:\\Windows匹配C:\Windows。

     四.重复

表2.常用的限定符
代码/语法说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

下面是一些使用重复的例子:

Windows\d+匹配Windows后面跟1个或更多数字

^\w+匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)

   五.分组

(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。

IP地址中每个数字都不能大于255. 经常有人问我, 01.02.03.04 这样前面带有0的数字, 是不是正确的IP地址呢? 答案是: 是的, IP 地址里的数字可以包含有前导 0 (leading zeroes).

不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。

  六.反义

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

表3.常用的反义代码
代码/语法说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

例子:\S+匹配不包含空白符的字符串。

<a[^>]+>匹配用尖括号括起来的以a开头的字符串。

七.注释

小括号的另一种用途是通过语法(?#comment)来包含注释。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。

要包含注释的话,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉。例如,我们可以前面的一个表达式写成这样:

      (?<=    # 断言要匹配的文本的前缀
      <(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
      )       # 前缀结束
      .*      # 匹配任意文本
      (?=     # 断言要匹配的文本的后缀
      <\/\1>  # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
      )       # 后缀结束

 

 

 

 

 

   

posted @ 2016-05-26 16:57  hyjj  阅读(189)  评论(0编辑  收藏  举报