正则表达式学习

 

正则表达式学习

 

正则表达式学习

1 简述

正则表达式就是regular expression,简写是regex或者regexp。
正则表达式就是用一组特定字符串来描述一段文本规律,用来查找文本用的,对我来说的话就是在编辑器里面用用。

2 预热

正则表达式历史悠久,版本众多。细看之下,Vim和Emacs的正则表达式还各有不同的,跟网上找的文档里面也不一样。

2.1 推测

regex是使用字符串对文本内容实现查找,这里可以推测一个regex的最小实现就是:输入源文本和regex字符串,输出匹配regex的文本位置。
regex可以实现强大的搜索功能,细想之下,在这个基础上可以实现的功能真是太多了。源代码解析编译肯定是会用到的,比如判定一个变量定义,判定一个赋值语句等,这些内容都需要以regex为基础来实现。还有就是智能编辑器里面,要实现语法高亮,也就是保留关键字、常量、字符串、注释这些需要有不同的字体颜色,这个也是明显需要用到regex的。

2.2 特殊字符

首先就是'\'——反斜杠(back-slash),这个是regex里面的转义符,后面跟其他特定的一些字符会产生匹配符,用来匹配特定的字符。
还有其他的特殊字符,叫做元字符(metacharacter),有

^ . [ ] $ { } * ( ) + | ? < >

这么多,这些在regex里面是本来就有特殊含义的。但是文本里面本来可能是有这些字符的,要匹配这些字符的话就需要在这些元字符前面加上转义符'\'。就像"\+"是在文本里面查找'+'。

3 匹配规则不完全小总结

不是都总结的到,都是一些最最基本的东西。

3.1 匹配预定义的字符

一些regex已经预定义好的一些匹配字符规则:

表格1
itemnotes
. 小数点,匹配除换行符以外的任意字符,有点通配符的意思
\w w代表word,匹配字母或者数字或者下划线或者汉字,其实就是一个word的基本组成啦
\s s代表space,匹配空白符,就是空格、tab、换行符这些
\d d代表digit,匹配数字

3.2 转义符'\'

有两个用途:

  • 加在特定字符前产生匹配符;
  • 加在元字符前用来匹配文本中的符号。

3.3 匹配自定义的字符集合

要匹配自己定义的字符集合的话要就是用"[]"中括号里面加上字符集合来实现,比如要匹配元音字母可以用"[aeiou]"这样来。
"[]"的特殊的地方是大多数元字符在里面是失效的,例外的情况是"\ : ^ -"这四个,'\'还是表示转义,'-'表示范围。"[a-z0-9A-Z]"就是表示英文大小写和数字的集合。

3.4 反义

就是跟匹配规则相反的匹配,有两种情况:

  • 大写:
    • \W 跟\w相对,匹配非字母、数字、下划线和汉字;
    • \S 跟\s相对,匹配非空白字符;
    • \D 跟\d相对,匹配非数字字符。
  • "[]"+"^"–>"[^…]"实现对集合"…"的反义。

3.5 匹配次数限定符

指的是对之前的匹配表达式的匹配次数的限定。

表格2
itemnotes
{m,n} 重复匹配m至n次,这里显然m<n,这是最基本的
{n} 重复n次,相当于{n,n}
{m,} 重复至少m次,相当于{m,+∞}
? 重复0或1次,相当与{0,1}
+ 重复至少1次,相当于{1,+∞}
* 重复任意次,相当于{0,+∞}
有了这么几条,其实就已经可以写出很多很多的regex字符串来,比如"\d{3,4}-\d{8}"——前面3~4个数字,中间一个'-',后接8个数字,可以表示一个电话号码,比如"028-66666666",要精确一点"0577-\d{8}",可以匹配区号是"0577"的号码。

3.6 位置匹配符

只匹配位置,不匹配字符的匹配符。

表格3
tiemnotes
\b 匹配一个字符串的开始或结尾
^ 匹配字符串的开头
$ 匹配字符串的结尾
再强调一下位置匹配符只匹配位置。 '\b'匹配字符串的分界,字符串里面的每个元素都是'\w',所以'\b'可以定义为:一个两侧有一个不是'\w'的位置。所以''就是——右侧是'\w'左侧不是的一个位置;'\('反之。
于是一个字符串可以按这个精确的定义为:"^\w+\)"。

4 未完

regex是很复杂的,不同的环境对regex的支持不一样,还有很多高级的特性没有学习到。
而这里总结的这些是最基础的,使用频率很高,也是被广泛支持的。
饭要一口一口吃,先这样吧。

Date: 2013-05-28 11:19:14 中国标准时间

Author: Mr.Zhou@org-mode

Org version 7.8.11 with Emacs version 24

Validate XHTML 1.0

 

posted @ 2013-05-28 11:20  自动控制原理  阅读(492)  评论(0编辑  收藏  举报