3rsh1
/single dog/college student/ctfer
3rsh1's Blog

正则表达式小记

正则表达式小记


——2020年2月28日 21点48分


表达式必须被包含在一对分隔符中,这个分隔符可以时任何非字母数字,’/’或空格的字符作为分隔符。

但是我们最常用的是/,若是在表达式中,使用特殊字符的话要用\来转义。

其中还有提到的一点就是,在分割符后可以加模式修饰符。/shop/i这里的i就是不区分字符大小写的意思。

i是最常用的修饰符。

关于通配符,我的理解就是字符但是在正则匹配中含有特殊的意义。

比如说.就代表除了换行符\n以外的其他字符。

[]内表示一个字符类,且[a-zA-Z]仅表示此方括号范围内的字符。若是[^a-z]则表示任何非范围内的字符。

除自己设置以外还有许多预定义的字符类:

[[:alnum:]] 数字文字字符
[[:alpha:]] 字母字符
[[:asci:]] ASCII字符
[[:space:]] 空白字符
[[:cntrl:]] 控制字符
[[:print:]] 所有可打印的字符
[[:graph:]] 所有除空格外可打印的字符
[[:punct:]] 标点符号
[[:blank:]] 制表符和空格
[[:lower:]] 小写字母
[[:upper:]] 大写字母
[[:digit:]] 小数
[[:xdigit:]] 十六进制数字
[[:word:]] word字符

外部的方括号近似看为边界,内部的方括号则为名称的一部分。

/[[:alpha]1-6]/ 字母字符和数字1-6的字符类

对于数量字符,

* 表示出现0次或多次
+ 表示出现1次或多次,其间没有0次
? 表示出现1次或0次,也就是至多出现1次

例子:

[[:alpha:]]?   即至多出现一个字母字符

子表达式的话,我的理解是里面有好多条件,其中每个独立的条件就叫做子表达式。不知道对不对,稍后勘误。

勘误:独立的条件没问题,对于每个子表达式,匹配时会各个匹配一遍。然后再把所有的子表达式放在一起匹配一遍。也有可能时把匹配完的结果混在一起。这里最好还是不要用这个子表达式了。

子表达式可以用括号()来实现。

/(very)*large/   表示very可能出现0次或多次,但是large是一直都有的。

若是紧跟着子表达式后有{}的话,则其表示子表达式中字符出现的次数。

/(very){1,3}large/ 其中{}内表示1-3次,very出现1-3次
/(very){1, }large/ 至少出现1次,无上限
/^[a-z]/    开头需要出现a-z中的一个字符。
/[a-z]/    结尾需要出现a-z中的一个字符。
/^[a-z]/   即,匹配出来的只有一个字符,因为[]表示的就是范围内的一个字符而已了。

还需要注意的是,|可以用来模式的选择。不知道可不可以用来选择子表达式,其实我觉得这个符号应该是or的意思。即从字符串开头开始,只要匹配到符合其中一个模式的字符串之后,就不会再进行匹配了。

还有奇奇怪怪的反斜杠\,这里只提一点就是如果要在正则表达式中使用特殊字符并使其不起作用,就需要在前面加上反斜杠\

元字符也就是特殊字符。这里分为[]内和[]外两部分。

   转义字符
^   在字符串开始匹配
$   在字符串结尾匹配
.   匹配除换行符以外的字符
|   选择分支的开始,也就是或
()  子表达式的开始和结束
{}  可选数量的开始和结束
+   出现一次或多次
*   出现0次或多次
?   出现1次或0次

对于反斜杠\:

1,放在转义字符前,\?

2,放在不可打印字符前,\n

3,放在特殊字符类型前,\d,表示十进制数字。

d  表示十进制数字
\D  表示任意非十进制数字
\h  水平空白符
\H  任意非水平空白符
\s  空白字符
\S  任意非空白字符
\v  垂直空白字符
\V  任意非垂直空白字符
\w  单词字符
\W  任意非单词字符

用正则表达式查找字符串:

preg_match(string pattern, string subject[, array matches[, int flags=0[, int offset=0]]])

pattern表示正则表达式或需要查找的字符串,subject表示原字符串,matches表示结果输出的数组,offset表示在subject中的偏移量,flags只有一个参数preg_offset_capture,表示数组中的元素将由子表达式和在subject中的偏移量组成。

<?php
a='nameasasas{123asdASD';b=[];
echo preg_match('/[[:alpha:]]+|name|[a-z]+{[1-9]+[a-z]+[A-Z]?/i',a,b,PREG_OFFSET_CAPTURE);
var_dump(b);c='123456';
d=[];
echo preg_match('/\d+|[[:alpha:]]+|name|[a-z]+{[1-9]+[a-z]+[A-Z]?/i',c,d,PREG_OFFSET_CAPTURE);
var_dump(d);
?>

用正则表达式替换字符串:

preg_replace ( mixed pattern , mixedreplacement , mixed subject [, intlimit = -1 [, int &$count ]] ) : mixed

pattern为需要被拿出来的正则表达式,replacement为放进去的字符串,subject为源字符串,limit限制最大替换次数,count表示替换的次数。默认limit=-1,即无数次。

str_replace ( mixed search , mixedreplace , mixed subject [, int &count ] ) : mixed

search为搜索的字符串,replace为替换过去的字符串,subject为源字符串,count为替换次数。

这里的str_replace函数貌似不支持正则匹配。

<?php
a='nameasasas{123asdASD';b=[];
echo str_replace('name','ok',a)."\r";
echo preg_replace('/[a-z]+/','ok',a);
?>
运行结果:
okasasas{123asdASD
ok{123okASD

这里需要注意的是双引号"" 可以表示更多的不可打印字符。

用正则表达式来分割字符串:

preg_split ( string pattern , stringsubject [, int limit = -1 [, intflags = 0 ]] ) : array

pattern表示分割参考的正则表达式,subject表示源字符串,输出的形式为一个数组,limit限制的是数组中元素的个数,flag接受以下的参数,这里只列举一种即PREG_SPLIT_NO_EMPTY,意思是返回的内容非空。

<?php
a='nameasasas{123asdASD';
var_dump(preg_split('/([a-f]){2,3}/',a));
?>

——2020年2月29日 21点16分


发表评论

textsms
account_circle
email

3rsh1's Blog

正则表达式小记
正则表达式小记 ——2020年2月28日 21点48分 表达式必须被包含在一对分隔符中,这个分隔符可以时任何非字母数字,'/'或空格的字符作为分隔符。 但是我们最常用的是/,若是在表达式中…
扫描二维码继续阅读
2020-04-19