正则表达式广泛地应用在各种编程语言中,包括 Perl、PHP、Ruby 等。Linux 也大量采用了正则表达式。有字符处理地地方,就有正则表达式地身影。正则表达式是一种概念,有各种风格的正则表达式,没有什么标准可言,不同的软件和编程语言支持不同风格的表达式写法。
Linux 有两套库课用于正则表达式编程:POSIX 库和 PCRE 库。前者是 Linux 自带的正则表达式库,后者是 Perl 的正则表达式库。
“单词”指的是两侧由非单词字符分隔的字符串。非单词字符指的是字母、数字、下划线以外的任何字符。
如上图。第 1~5 行都属于单词,子串(hm、cat等)两边都是字母,符合单词的定义;第 6~15 行,不包括第 14 行,子串 bat、sat 等左右两侧都是非单词符号。在匹配时加上\<[expression]\>
这样的分隔符,就能匹配第五行之后但不包括第十四行的字符。
正则表达式的元字符就是诸如 *、+、?、[] 之类的符号。如果字符当中就是要匹配这些字符,在正则表达式中就必须要对它们进行转义,在元字符前加上\
,也就是让正则表达式忽略这些元字符,当成普通的符号。
元字符 | 描述 |
---|---|
* | 重复0次或多次 |
+ | 重复1次或多次 |
? | 重复0次或1次 |
{n} | 重复 n 次 |
{n,} | 重复 n 次或更多次 |
{n, m} | 重复不少于 n 次,不多于 m 次 |
如下图,匹配这些字符当中,开头是 Ak 的,且 k 重复 2 次或更多次的字符。
开头的元字符是^
,结尾的元字符是$
。
上面的重复表达式都是对前一个子串进行匹配,假如有一个字符串 fofofoooffffofooofo,匹配 fo 出现的次数只能是 2 次,就得把 fo 用一对小括弧括起来再添加重复匹配得元字符。
如果不把 fo 括起来,得到的结果如下:
匹配的是 o 出现的次数是 2 次。
反义就是除了这个以外的所有子串都能被匹配。反义的符号是^
,跟开头元字符是一样的,但反义是在[]
中使用的。开头元字符跟子串相连使用。
如上图,除了 a、t 以外的子串都能被匹配,也就是白色的字母是不被选择的。
分支就是或的意思,假如要求匹配开头以 x 或 y 的字符:
Linux 用到的表达式用不着这么复杂,比较也就简单的做一个内容查找的功能,想要的字符应该也不是那么复杂。其实网上都有很多常用的正则表达式,直接 copy 过来用就行。正则表达式还有很多语法可以学,比如逆向引用。