正则表达式基础学习

1.单词的边界

假设你在一篇英文小说里查找hi,你可以使用正则表达式hi。不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b

\b 是一个元字符,匹配是否达到了单词的边界(单词分界处)

一个单词两边只要没有数字、字母、下划线就可以认为是独立单词,去判断单词前一个字符是不是在这四个之外,是的话就认为是单词 开头。

例子:

<?php
$arr=array('i','hi+','mhi','hi',' hi ','  hi+','-----hi','1hi','_hi');
var_dump(preg_grep('/\bhi\b/',$arr));

?>
输出结果
  array (size=5)
  1 => string 'hi+' (length=3)
  3 => string 'hi' (length=2)
  4 => string ' hi ' (length=4)
  5 => string '  hi+' (length=5)
  6 => string '-----hi' (length=7)

2.元字符 ^,$

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

[abc] 匹配任何包含小写字母a、b、c的字符串,但注意只包含其中某一个

例如:

<?php
$arr="kabck";
var_dump(preg_replace('/k[abc]k/','',$arr));
?>
输出结果

string 'kabck' (length=5)

说明没有原字符串没有搜到一处匹配的。


3.分组
怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作。

字符类来描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

解释:2[0-4]\d表示200-249;25[0-5]表示250-255;[01]?\d\d?表示0-199;|表示分枝条件(是用|把不同的规则分隔开)。和在一起就是ip范围的限制了。

4.后向引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。难以理解?请看示例:

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

你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b


5.零宽断言

零宽断言,大多地方这样定义它,用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像 \b ^ $ \< > 这样的锚定作用,用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。简单地说是在一个限定位置的字符串之前或之后进行匹配查找

注意的是它只匹配一个位置,并不消费任何字符

例如:

<?php
$arr="123456789012";
$arr1="1234567890";
$arr3="I'm singing while you're dancing";
var_dump(preg_replace('/((?<=\d)\d{3})+/','*',$arr));
var_dump(preg_replace('/((?<=\d)\d{3})+\b/','*',$arr1));
var_dump(preg_replace('/\b\w+(?<=ing\b)/','*',$arr3));
?>
输出结果:

string '1*12' (length=4)
string '1*' (length=2)
string 'I'm * while you're *' (length=20)

((?<=\d)\d{3})+
先去掉 (?<=\d)看一下,(\d{3})+ 表示若干个三位数字,也就是匹配三的倍数的数字,(?<=\d)表示在\d{3}这个正则前必须要有一位数字,但这个数字并不被正则所匹配掉,因此还可以匹配以后的\d{3},(?<=\d)对第二个\d{3}开始都是成立的,完全可以放到外面来(?<=\d)(\d{3})+\b

<?php
$str="abcgwcab";
$parent='/bc(?=gw)ca/';
$str=preg_match($parent,$str,$match);
var_dump($match);
?>

输出结果:

array (size=0)
  empty


正则表达式中还有很多类容,但根据不同的语言,支持的功能不同。例如正则中的“平衡组/递归”,.NET和PHP对此就不同。分享一个网上某个人写的正则表达式学习总结,写的很好http://deerchao.net/tutorials/regex/regex.htm,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值