10分钟学会正则

今天发了一篇关于Apache Rewrite的日志,由于配置都是用正则表达式写的,就想翻翻之前的QQ空间,把关于正则表达式的内容贴出来。
由于是之前从网上摘的,也忘了是哪摘的了(之前没有写来源的习惯),不过在谷歌上把标题打进去会发现不少相同的文章。可是本帖结合了一些东西,因此会比原文内容丰富一些。php

首先来看看百度百科的解释:一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。 [百度百科释义]正则表达式

想必不少人都对正则表达式都头疼.今天,我以个人认识,加上网上一些文章,但愿用常人均可以理解的表达方式.来和你们分享学习经验.
开篇,仍是得说说 ^ 和 $ 他们是分别用来匹配字符串的开始和结束,如下分别举例说明
”^The”: 开头必定要有”The”字符串;
”of despair$”: 结尾必定要有”of despair” 的字符串;
那么,
”^abc$”: 就是要求以abc开头和以abc结尾的字符串,其实是只有abc匹配
”notice”: 匹配包含notice的字符串
你能够看见若是你没有用咱们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 能够出如今被检验字符串的任何地方,你没有把他锁定到两边服务器

  接着,说说 ‘*’, ‘+’,和 ‘?’,
他们用来表示一个字符能够出现的次数或者顺序. 他们分别表示:
”zero or more”至关于{0,},
”one or more”至关于{1,},
”zero or one.”至关于{0,1}, 这里是一些例子:
”ab*”: 和ab{0,}同义,匹配以a开头,后面能够接0个或者N个b组成的字符串(“a”, “ab”, “abbb”, 等);
”ab+”: 和ab{1,}同义,同上条同样,但最少要有一个b存在 (“ab”, “abbb”, 等.);
”ab?”:和ab{0,1}同义,能够没有或者只有一个b;
”a?b+$”: 匹配以一个或者0个a再加上一个以上的b结尾的字符串.
要点, ‘*’, ‘+’,和 ‘?’只管它前面那个字符.ide

  你也能够在大括号里面限制字符出现的个数,好比
”ab{2}”: 要求a后面必定要跟两个b(一个也不能少)(“abb”);
”ab{2,}”: 要求a后面必定要有两个或者两个以上b(如”abb”, “abbbb”, 等.);
”ab{3,5}”: 要求a后面能够有3-5个b(“abbb”, “abbbb”, or “abbbbb”).
如今咱们把必定几个字符放到小括号里,好比:
”a(bc)*”: 匹配 a 后面跟0个或者一个”bc”;
”a(bc){1,5}”: 一个到5个 “bc.”
还有一个字符 ‘│’, 至关于OR 操做:
”hi│hello”: 匹配含有”hi” 或者 “hello” 的 字符串;
”(b│cd)ef”: 匹配含有 “bef” 或者 “cdef”的字符串;
”(a│b)*c”: 匹配含有这样多个(包括0个)a或b,后面跟一个c 的字符串;
一个点(‘.’)能够表明全部的单一字符,不包括”n”
若是,要匹配包括”n”在内的全部单个字符,怎么办?
对了,用’[n.]‘这种模式.
”a.[0-9]“: 一个a加一个字符再加一个0到9的数字
”^.{3}$”: 三个任意字符结尾 .
中括号括住的内容只匹配一个单一的字符
”[ab]“: 匹配单个的 a 或者 b ( 和 “a│b” 同样);
”[a-d]“: 匹配’a’ 到’d'的单个字符 (和”a│b│c│d” 还有 “[abcd]“效果同样); 通常咱们都用[a-zA-Z]来指定字符为一个大小写英文
”^[a-zA-Z]“: 匹配以大小写字母开头的字符串
”[0-9]%”: 匹配含有 形如 x% 的字符串
”,[a-zA-Z0-9]$”: 匹配以逗号再加一个数字或字母结尾的字符串
你也能够把你不想要得字符列在中括号里,你只须要在总括号里面使用’^’ 做为开头 “%[^a-zA-Z]%” 匹配含有两个百分号里面有一个非字母的字符串.
要点:^用在中括号开头的时候,就表示排除括号里的字符学习

  为了PHP可以解释,你必须在这些字符面先后加”,而且将一些字符转义.
不要忘记在中括号里面的字符是这条规路的例外—在中括号里面, 全部的特殊字符,包括(”), 都将失去他们的特殊性质 “[*+?{}.]“匹配含有这些字符的字符串.
还有,正如regx的手册告诉咱们: “若是列表里含有 ‘]’, 最好把它做为列表里的第一个字符(可能跟在’^'后面). 若是含有’-', 最好把它放在最前面或者最后面, or 或者一个范围的第二个结束点[a-d-0-9]中间的‘-’将有效.
看了上面的例子,你对{n,m}应该理解了吧.要注意的是,n和m都不能为负整数,并且n老是小于m. 这样,才能 最少匹配n次且最多匹配m次. 如”p{1,5}”将匹配 “pvpppppp”中的前五个p
下面说说以开头的
b 书上说他是用来匹配一个单词边界,就是…好比’veb’,能够匹配love里的ve而不匹配very里有ve
B 正好和上面的b相反.例子我就不举了
好,咱们来作个应用:
如何构建一个模式来匹配 货币数量 的输入
构建一个匹配模式去检查输入的信息是否为一个表示money的数字。咱们认为一个表示money的数量有四种方式: “10000.00″ 和 “10,000.00″,或者没有小数部分, “10000″ and “10,000″. 如今让咱们开始构建这个匹配模式:
^[1-9][0-9]*$
这是所变量必须以非0的数字开头.但这也意味着 单一的 “0″ 也不能经过测试. 如下是解决的方法:
^(0│[1-9][0-9]*)$
”只有0和不以0开头的数字与之匹配”,咱们也能够容许一个负号在数字以前:
^(0│-?[1-9][0-9]*)$
这就是: “0 或者 一个以0开头 且可能 有一个负号在前面的数字.” 好了,如今让咱们别那么严谨,容许以0开头.如今让咱们放弃负号 , 由于咱们在表示钱币的时候并不须要用到. 咱们如今指定 模式 用来匹配小数部分:
^[0-9]+(.[0-9]+)?$
这暗示匹配的字符串必须最少以一个阿拉伯数字开头. 可是注意,在上面模式中 “10.” 是不匹配的, 只有 “10″ 和 “10.2″ 才能够. (你知道为何吗)
^[0-9]+(.[0-9]{2})?$
咱们上面指定小数点后面必须有两位小数.若是你认为这样太苛刻,你能够改为:
^[0-9]+(.[0-9]{1,2})?$
这将容许小数点后面有一到两个字符. 如今咱们加上用来增长可读性的逗号(每隔三位), 咱们能够这样表示:
^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
不要忘记 ‘+’ 能够被 ‘*’ 替代 若是你想容许空白字符串被输入话 (为何?). 也不要忘记反斜杆 ’’ 在php字符串中可能会出现错误 (很广泛的错误).测试

  如今,咱们已经能够确认字符串了, 咱们如今把全部逗号都去掉 str_replace(“,”, “”, $money) 而后在把类型当作 double而后咱们就能够经过他作数学计算了.编码

  再来一个:
构造检查email的正则表达式
在一个完整的email地址中有三个部分:
1. 用户名 (在 ‘@’ 左边的一切),
[email=2.'@']2.[/email],
3. 服务器名(就是剩下那部分).
用户名能够含有大小写字母阿拉伯数字,句号 (‘.’), 减号(‘-’), and 下划线 (‘_’). 服务器名字也是符合这个规则,固然下划线除外.spa

  如今, 用户名的开始和结束都不能是句点. 服务器也是这样. 还有你不能有两个连续的句点他们之间至少存在一个字符,好如今咱们来看一下怎么为用户名写一个匹配模式:日志

  ^[_a-zA-Z0-9-]+$
如今还不能容许句号的存在. 咱们把它加上:
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$
上面的意思就是说: “以致少一个规范字符(除了.)开头,后面跟着0个或者多个以点开始的字符串.”
简单化一点, 咱们能够用 eregi()取代 ereg().eregi()对大小写不敏感, 咱们就不须要指定两个范围 “a-z” 和 “A-Z” – 只须要指定一个就能够了:
^[_a-z0-9-]+(.[_a-z0-9-]+)*$
后面的服务器名字也是同样,但要去掉下划线:
^[a-z0-9-]+(.[a-z0-9-]+)*$
好. 如今只须要用”@”把两部分链接:
^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$ip

  这就是完整的email认证匹配模式了,只须要调用
eregi(‘^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$ ’,$eamil)
就能够获得是否为email了
正则表达式的其余用法
提取字符串
ereg() and eregi() 有一个特性是容许用户经过正则表达式去提取字符串的一部分,好比说,咱们想从 path/URL 提取文件名 – 下面的代码就是你须要:
ereg(“([^\/]*)$”, $pathOrUrl, $regs);
echo $regs[1];
高级的代换
ereg_replace() 和 eregi_replace()也是很是有用的: 假如咱们想把全部的间隔负号都替换成逗号:
ereg_replace(“[ nrt]+”, “,”, trim($str));
最后,我把另外一串检查EMAIL的正则表达式让看文章的你来分析一下.
“^[-!#$%&'*+\./0-9=?A-Z^_`a-z{|}~]+’.'@’.’[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+.’.’[-!#$%&'*+\./0-9=?A-Z^_`a-z{|}~]+$”
  若是能方便的读懂,那这篇文章的目的就达到了.

 下面附上经常使用的正则表达式【摘自百度百科】

  经常使用的正则表达式主要有如下几种:

  匹配中文字符的正则表达式: [u4e00-u9fa5]

  评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

  匹配双字节字符(包括汉字在内):[^x00-xff]

  评注:能够用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

  匹配空白行的正则表达式:ns*r

  评注:能够用来删除空白行

  匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?</>|<.*? />

  评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

  匹配首尾空白字符的正则表达式:^s*|s*$

  评注:能够用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),很是有用的表达式

  匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

  评注:表单验证时很实用

  匹配网址URL的正则表达式:[a-zA-z]+://[^s]*

  评注:网上流传的版本功能颇有限,上面这个基本能够知足需求

  匹配账号是否合法(字母开头,容许5-16字节,容许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

  评注:表单验证时很实用

  匹配国内电话号码:d-d|d-d

  评注:匹配形式如 0511-4405222 或 021-87888822

  匹配腾讯QQ号:[1-9][0-9]{4,}

  评注:腾讯QQ号从10000开始

  匹配中国邮政编码:[1-9]d(?!d)

  评注:中国邮政编码为6位数字

  匹配×××:d|d

  评注:中国的×××为15位或18位

  匹配ip地址:d+.d+.d+.d+

  评注:提取ip地址时有用

  匹配特定数字:

  ^[1-9]d*$ //匹配正整数

  ^-[1-9]d*$ //匹配负整数

  ^-?[1-9]d*$ //匹配整数

  ^[1-9]d*|0$ //匹配非负整数(正整数 + 0)

  ^-[1-9]d*|0$ //匹配非正整数(负整数 + 0)

  ^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮点数

  ^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配负浮点数

  ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮点数

  ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配非负浮点数(正浮点数 + 0)

  ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮点数(负浮点数 + 0)

  评注:处理大量数据时有用,具体应用时注意修正

  匹配特定字符串:

  ^[A-Za-z]+$ //匹配由26个英文字母组成的字符串

  ^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串

  ^[a-z]+$ //匹配由26个英文字母的小写组成的字符串

  ^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串

  ^w+$ //匹配由数字、26个英文字母或者下划线组成的字符串

相关文章
相关标签/搜索