May 21, 2012

正则表达式,regular expression


Regex Tutorial
这个非常好

中文翻译,不过英文版本有更新


Literal     文本字符
meta-character  元字符、特殊字符
escape sequence:   \meta-character
注意在一些使用了正则表达式的console命令中,'...'或/.../用于表示 search expression 的开始和结尾如
grep '^win'
它们并非元字符

字符:0-9,a-z,A-z,可以打印的符号空格Tab断行(是否作为字符可以特殊的规定)
不可显示字符
\t Tab
\r 回车
\n 换行 (windows使用 \r\n,unix 使用 \n)

字符串  指正则表达式处理的整个内容,包含换行换页等等


元字符

元字符11个:[ ] \ ^ & . | ? * + ( )
它们作为文本字符,要加 escape \, 比如 1\+1=2

1. 任意字符
"." : 匹配一个任意字符,并且不能没有,且不匹配换行
2. 字符集以及字符集内部的范围和取反
  • [] : []中的字符被匹配 once and only once
  • - : 在 [] 中且在字符中间才是元字符,表示连续范围,[0-9] [0-9A-C];而 [-a-zA-Z] 第一个 - 不表示范围,而是表示符号 “-” dash
  • ^ :取反 [^Ff] 除 f, F 外任一字符;^ 需紧跟 [
字符集中的元字符,只有4个有特殊含义,其他元字符都是文本字符。这4个字符是 ], \, ^, -

常用字符集的简写
\d 等价于 [0-9]
\D 等价于 [^\d]
\w 单词集 [A-Za-z0-9_]
\W [^\w]
\s space,包含空格,Tab, \r, \n
\S  [^\s]

字符集的重复是重复整个字符集,而非某个字符,eg [\d]+,不仅匹配777,也匹配 789

3. 位置
^ (在[]以外) 表示 target string 的开始
$                    表示 target string 的结尾

4. 重复
?: 前面一个字符 0或1次,等价于 {0,1}
*: 前面一个字符 0或多次,>= 0
+: 前面一个字符 1或多次,>= 1
{n}: 前面一个字符 n 次
{n,m}: 前面一个字符 m >= 次数>= n 

eg. [a-z]+ 匹配任意小写字母组合,abc, hkl, a

eg. ".+" 匹配任意字符,但不包含断行

5. 其他元字符
() 将表达式的小成分组合起来。注:()是有分组含义的,在python中这与group有关
| 逻辑或
eg  ((4\.[0-3])|(2\.[0-3])) 匹配 4.0-4.3或2.0-2.3

+,?,*的贪婪性

正则导向的引擎是贪婪的,匹配的结果越长越好。
eg This is a first<\em> text. 
用 <.+>匹配,结果为 first<\em>

可以用懒惰性代替贪婪性
+     +?
*     *?
?     ??

eg abc 用 [a-c]?? 匹配得到4个结果,分别为 |a|b|c| 四个 | 的位置,匹配结果长度为 0

0 comments: