初学正则
最近看到一篇关于“京东定向爬虫“的帖子,觉得好玩,打算学习一下。大致了解了下代码,发现需要用到正则表达式,于是先行简单学习正则。参考了园子里的前辈的博客内容,如有相似,请见谅~
- 正则简介
正则表达式就是一种特殊的字符串模式,用来匹配符合规则的字符串。
在线匹配工具:http://rubular.com/
- 正则表达式基本语法
"^":匹配起始位置。("^h":匹配"hello"'、"hi")
"$":匹配行或字符串的结尾。("^abc$":开始和结尾都是"abc"的字符串,只有"abc")
"\b":不会消耗任何字符只匹配一个位置,常用于匹配单词边界。
"\d":匹配数字。("\d{2}":匹配两位数)
"\w":匹配字母,数字,下划线。
"\s":匹配空格。
".":匹配除了换行符以外的任何字符。
"[abc]":字符组,匹配包含括号内元素的字符。
※大写表示反义:"\W"、"\S"、"\D"、"\B"、"[^abc]"。
"*":重复零次或更多。(贪婪)相当于{0,}。
"+":重复一次或更多次。相当于{1,}。
"?":重复零次或一次。相当于{0,1}。
"{n}":重复n次。
"{n,m}":重复n到m次。
"{n,}":重复n次或更多次。
"*?":重复任意次,但尽可能少重复。(非贪婪)
"+?":重复1次或更多次,但尽可能少重复。
- 正则表达式—分组
先举例,要匹配"abba",正则表达式为"([a-z])([a-z])\2\1"。捕获分组,其实就是括号内的内容,后面有相同的内容时,可以对捕获分组进行后向引用,以简化表达式。
"(exp)":匹配exp,并捕获文本到自动命名的组里。自动命名:\1、\2...
"(?<name>exp)":匹配exp,并捕获文本到名称为name的组里。对于上述例子,换种写法,"(?<str1>[a-z])(?<str2>[a-z])\k<str2>\k<str1>",也能实现。
- 初步实战练习
/^[0-9]*$/
##校验纯数字组合
/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){15,19}$/
##以字母开头、可带数字、“_”、“.”的16~20位字符串
/^[a-zA-Z]{15,}$/
##15位以上纯字母的字符串
/^1\d{10}$/
##11位电话号码
/^http[s]{0,1}:\/\/.+$/
##校验URL
/^[\u4E00-\u9FA5]+$/
##纯中文字符
/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/
##email地址 zhang.sh@136mail.net
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/
##年-月-日
总结,目前一些基本的正则都可以随手写一写,稍微复杂的,分解一下,才能搞懂。还有很多更复杂的表达式,看了也是头昏脑涨,尤其在贪婪表达的那一块,很容易把自己绕到坑里。对于相同的规则,有的人写出的正则就很妙,有的就很普通。有空还是要多看看别人写的正则,多些思路,扩展自己的思维。
’End zsh 20160321