正则表达式学习

今天是关于正则表达式的一些学习,以下是我的一些心得。
首先说一下什么是正则表达式,它是查找符合某些复杂规则的字符串的匹配工具。
言归正传,往下看:
\b是正则表达式规定的一个特殊代码,代表着单词的开头或结尾。
假如你要找的是hi后面不远处跟着一个Lucy,你应该用\bhi\b.*\bLucy\b.
特殊代码

常用的特殊代码
代码/语法 说明

  • .  匹配除换行符以外的任意字符
  • \w  匹配字母或数字
  • \s  匹配任意的空白符
  • \d  匹配数字
  • \b  匹配单词的开始或结束
  • ^  匹配字符串的开始
  • $  匹配字符串的结束

.是另一个特殊代码,代表除了换行符以外的任意字符。*同样是特殊的代码,不过它代表的不是字符,也不是位置,而是数量–它指定*前边的内容可以重复任意次以使整个表达式得到匹配。因此,.*连在一起就意味着任意数量的不包含换行的字符。
\ba\w*\b匹配以字母a开头的单词-先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)。
\d+匹配1个或更多连续的数字。这里的+是和类似的特殊代码,不同的是代表重复任意次(可能是0次),而+则代表重复1次或更多次。
\b\w{6}\b 匹配刚好6个字母/数字的单词。

转义字符
\用来转义一些特殊字符,如:
deerchao\.net匹配deerchao.net,c:\\windows匹配c:\windows,2\^8匹配2^8

常用的量词
代码/语法 说明

  • * 重复零次或更多次
  • + 重复一次或更多次
  • ?  重复零次或一次
  • {n}  重复n次
  • {n,}  重复n次或更多次
  • {n,m}  重复n到m次

想匹配没有预定义特殊代码的字符集比如元音字母(a,e,i,o,u),怎么办?

很简单,你只需要在中括号里列出它们就行了,像[aeiou]就匹配任何一个元音字母,[.?!]匹配标点符号(.或?或!)(英文语句通常只以这三个标点结束)。
要注意的是,在中括号中,特殊代码不会被解释成其它意义,所以我们不需要写成[\.\?!]

反义
有时需要查找不属于某个简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:

常用的反义代码

代码/语法 说明

  • \W  匹配任意不是字母和数字的字符
  • \S  匹配任意不是空白符的字符
  • \D  匹配任意非数字的字符
  • \B  匹配不是单词开头或结束的位置
  • [^x]  匹配除了x以外的任意字符
  • [^aeiou]  匹配除了aeiou这几个字母以外的任意字符

接下来来一些由浅入深的例子帮助理解正则表达式:

  • [\da-zA-Z_]{1,}  数字和字母组合,至少重复一次以上 等价于 > [\w]{1,}
  • 0\d{2}-\d{8}  匹配023-12345678这样的座机号
  • \d{5,12}  5到12位的qq号
  • \w+@.[0-9a-z]+.[a-z]{2,4}  邮箱格式匹配
  • (\d{1,3}.){3}\d{1,3}  简单ip的匹配规则,但是能匹配888.999.256.12这样的非法ip
  • ((2[0-4]\d 25[0-5] [01]?\d\d?).){3}(2[0-4]\d 25[0-5] [01]?\d\d?)  较准确的ip地址匹配

后面相对比较复杂的还有后向引用和位置指定的一些内容,基础的基本已经够用了。

Tang Jing

Tang Jing

My name is Tang Jing. I'm from Chongqing, China. Now I'm a new graduate programmer. Usually I like shopping, traveling, playing badminton, playing guitar, singing and dancing rap, but I don't like playing basketball very much. Welcome everyone to make friends, leather is very happy!My qq is 924987841.