正则表达式

来自:《精通正则表达式》

*表示任意文本

?表示任意单个字符

.表示1个或多个字符

通用的模式语言 :generalized pattern language

行的起始和结束:

^代表一行的开始

$代表一行的结束

例如: ^cat ,匹配的是以c作为一行的第一个字符,紧接一个a,紧接一个b

^ 和 $ 符合特别之处在于,它匹配的是一个位置,而不是具体的文本

分析^cat## 、## 和^

  • ^cat$

    匹配,行开头(显然,每一行都有开头),然后是字母c ,a,t,然后是行末尾

  • $

    匹配,行开头,然后是行末尾

    应用:空行(没有任何字符,包括空白字符)

  • ^

    匹配:行开头

    应用:无意义!

不妨把字符组看作独立的微型语言。在字符组内部和外部,关于元字符的规定(哪些是元字符,以及他们的意义)是不同的

^在字符组外部表示一个行锚点(line anchor),但是在字符组内部(而且必须是紧挂载字符组的第一个方括号之后),他就是个元字符

为什么 q[^u],无法匹配Qantas或者raq

  • Qantas无法匹配的原因是:正则表达式要求小写q,而Qantas中的Q是大写的。应该用[Qq][^u]
  • raq 的例子有点迷惑人。正则表达式要求 q 后面紧跟一个u以外的字符,这就排除了q在行位的情况。通常来说,文本行的结尾有一个换行符字符,但是egrep 会在检查正则表达式之前把这些换行符去掉,所以在行尾的q后,没有能够匹配u以外的字符。

通过这个例子要认识到:一个字符组即使是排除型字符数组,也需要匹配一个字符

字符组

  1. 匹配若干字符之一 [...]

    [1-6]、[a-z]、简便写法,匹配1-6和a-z的任意字符之一

    注意:只有在字符组内部([]),连字符 -才是元字符,否则它就是普通的 -字符,如果 -出现在开头 它表示一个普通字符

  2. 排除型字符组 [^...]

    [^1-6]匹配除了1-6以外的任意字符

  3. 用点号表示任意字符 [.]

    搜索: 03/19/76、03-19-76或 03.19.76

    精确写法:03[-./]19[-./]76

    不精确写法:03.19.76(易于理解,但是也会匹配到 03 19 76)

多选结构

匹配任意子表达式 |

^(From|subject|Date):*

匹配以 From:,subject:Date:开头的文本行

可选元素

?

作用于之前紧邻的元素

colou?r

先是一个c,然后是o,然后是l,然后是o,然后是u,然后是一个任意字符,最后是 r

其他量词

+,表示之前紧邻的元素出现一次或者多次

*表示之前紧邻的元素出现任意多次(或者不出现)

\转义字符

实例

  • 匹配变量名:只包含字母、数字以及下划线,不能以数字开头

    [a-zA-z_][a-zA-z_0-9]*

  • 引号内的字符

    "[^"]*"

  • 美元金额

    \$[0-9]+(\.[0-9][0-9])?

  • Http/HTML URL

    \<http://[-a-z0-9_.:]+/[a-z-0-9_:@&?=+,.!/~*%$]*\.html?\>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值