6、7个小时是我学习正则用的时间,网上有个著名的30分钟正则表达式,可惜本人愚笨,学不会,最后还是看书学的。原本是想写一个6、7个小时正则表达式教程的,但是写完感觉太差了,名字就改了。
介绍下正则
正则是一个快速处理、提取文本信息的工具。它可以从复杂庞大的文本中找到你指定的信息。超级的方便实用。
开始学习正则
-
perl中使用正则
在perl中使用正则是及其简单的,只要使用
str=~/正则表达式/
即可,匹配到则返回1,否则返回0。对于结果的保存,perl中是这样设计的。# 方法1 # 将需要提取的结果用“()”括起来 $str =~ /...(结果1)...(结果2)...(结果3).../; # 调用只要用“$”+数字,数字对应从左向右数的括号数 $1; # 结果1 $2; # 结果2 $3; # 结果3 # 方法2 # 将需要提取的结果用“()”括起来,赋值给一个数组 @arr = ($str =~ /...(结果1)...(结果2)...(结果3).../); # 结果将自动保存在@arr中 $arr[0]; # 结果1 $arr[1]; # 结果2 $arr[2]; # 结果3
-
最基本的完全匹配
完全匹配的意思即一模一样,只有一模一样时,才算匹配。
$str = "完全匹配的意思是一模一样"; if($str =~ /意思/) { print("匹配上"); } else { print("没有匹配上"); } # 输出:匹配上
-
多对一匹配 [] 和择一匹配 |
只要在"[]"中的一个匹配,就算匹配上。
择一匹配是|两边有一边匹配上就行。
区别是 [] 内只能是一个字符,| 两边可以是字符串正则表达式# 多对一匹配 $str = "只要[]中有一个对上就行"; if($str =~ /有[一二三]对上/) { print("[]内有一个对上了,[]外完全匹配"); } else { print("[]内一个都没对上,或[]外没对上"); } # 输出:[]内有一个对上了,[]外完全匹配 # 择一匹配 if($str =~ /只要|不只要/) { print("|两边有一边匹配到就行"); }
-
量词匹配 *、+、?和{n1, n2}
* : 代表匹配任意多的,0 ~ 无穷
+ : 代表匹配至少一次,1 ~ 无穷
? : 代表匹配1次或者0次
{n1,n2}代表匹配n1次到n2次都行
$str = "多多多次次次匹匹匹配配配"; # * 使用 if($str =~ /多*/) { print("有或没有或有多个:多"); } # + 使用 if($str =~ /次+/) { print("至少有一个:次"); } # ? 使用 if($str =~ /匹?/) { print("有或没有:匹"); } # {}使用 if($str =~ /配{2,10}/) { print("有2~10个:配"); } # 多个字 使用 if($str =~ /(匹配)+/) { print("至少出现一次:匹配"); }
-
字符集
-:只在[]中有用,代表从~到~,[0-9],匹配从0到9中的任意一个 \d : [0-9] ^:取反只在[]内有用,表示匹配^后面一个字符以外的任意一个字符。 \w:匹配字母,数字和下划线 \s : 匹配空白(换行和空格),相当于[\f\n\t\r ], # \r后面还有一个“ ”空格 \h : 相当于[\t ],匹配空格 \v : [\f\n\r] 匹配换行 # 注:将上述字母改为大写,相当于取反
-
锚点
字符串锚点:$代表字符串结尾,^代表字符串开头
单词锚点:\b单词边界,\B非单词边界
$str = "起始中间结尾"; if($str =~ /^中间/) { print("必须在字符串起始位置才匹配"); } else { print("不在起始位置"); } # 输出 不在起始位置
总结下
正常情况下,上面说的这些就差不多可以完成大部分正常的正则匹配了。但除了上面这些正则还有一些其他的知识点,但是用的比较少就不写出来了。
最后再贴一个我学习正则的思维导图,忘记的时候很方便查(我查(▽))。
想要的可以给我点赞哈,用xmind软件画的。