正则表达式入门

1. 元字符

.匹配除换行符以外的任意字符
/w  
匹配字母或数字或下划线或汉字
/s匹配任意的空白符
/d匹配数字
/b匹配单词的开始或结束,也就是单词的分界处,但是\b并不匹配单词分隔字符中的任何一个,它只匹配一个位置
^匹配字符串的开始位置
$匹配字符串的结束位置
下面来看看更多的例子:

\ba\w*\b
匹配以字母 a 开头的单词,先是某个单词开始处\b,然后是字母a,然后是任意数量的字母或数字 \w*,最后是单词结束处 \b

\d+
匹配1个或更多连续的数字。这里的 + 是和 * 类似的元字符,不同的是*匹配重复任意次,而+则匹配重复1次或多次

\b\w{6}\b
匹配刚好6个字母/数字的单词

^\d{5,12}$
元字符^和$都匹配一个位置,^匹配你要用来查找的字符串的开头,$匹配结尾。
整个输入必须是5到12个数字

2. 字符转义 \

如果你想查找 . , 者* ,字符,这时会出现问题,因为它们会被解释成别的意思,这时你要使用 \ 来取消这些字符的特殊意义。

例如:

unibetter\.com
匹配unibetter.com

C:\\Windows
匹配C:\Windows

3. 重复 { }

*
重复零次或多次
+
重复一次或多次

重复零次一次
{n}
重复n 次
{n,}
重复n 次或多次
{n,m}
重复n 到 m次
下面是一些使用重复的例子:

Windows\d+
匹配 Windows后面跟 1 个或更多个数字

^\w+
匹配一行的第一个单词

4. 字符类 [ ]

[aeiou]
就匹配任何一个英文元音字母

[.?!]
匹配标点符号(.或?或!)

[0-9]
代表的含意与\d就是完全一致的,即一位数字

[a-z0-9A-Z_]
也完全等同于\w(如果只考虑英文的话)

\(?0\d{2}[) -]?\d{8}。
这个表达式可以匹配几种格式的电话号码,像(010)88886666,或 022-22334455,或02912345678等。
分析:首先是一个转义字符 \( ,它能出现0次或1次(?), 然后是一个0,后面跟着2个数字(\d{2}),
然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字 \d{8}。

5. 分支条件 |

不幸的是,刚才那个表达式也能匹配 010)12345678 或 (022-87654321 这样的 “不正确”的格式。

要解决这个问题,我们需要用到分支条件。具体方法是用 | 把不同的规则分隔开。

0\d{2}-\d{8}|0\d{3}-\d{7}
这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。

\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}
这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。

\d{5}-\d{4}|\d{5}
这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。
使用分支条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。
原因是匹配分支条件时,将会从左到右地测试每个条件,如果满足了某个分支的话,就不会去再管其它的条件了。

6. 分组 ( )

(\d{1,3}\.){3}\d{1,3}
是一个简单的IP地址匹配表达式。
分析:\d{1,3} 匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,
最后再加上一个一到三位的数字( \d{1,3} )。
不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。

描述一个正确的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|25[0-5]|[01]?\d\d?

7. 反义

有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,

其它任意字符都行的情况,这时需要用到反义:

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

\S+
匹配不包含空白符的字符串。

<a[^>]+>
匹配用尖括号括起来的以a开头的字符串。

8. 贪婪与懒惰  ?

*?重复任意次,尽可能少重复
+?重复1次或更多次,尽可能少重复
??重复0次或1次,尽可能少重复
{n,m}?重复n到m次,尽可能少重复
{n,}?重复n次以上,尽可能少重复
贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能多的字符。

a.*b
它将会匹配最长的以 a开始,以b结束的字符串,用它来搜索aabab的话,它会匹配整个字符串aabab。

懒惰匹配:有时,我们更需要匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

a.*?b
匹配最短的,以 a 开始,以 b 结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值