正则表达式

Unix系统偏好于以可读的文本处理

  • vi、emacs、grep、sed、awk都支持正则表达式
  • systemd

正则表达式RE是一种语言,这种语言表现为一种的表达式

RE可以完全的表示有限自动机DFA、NFA

RE主要用于定义词法

Posix标准中RE分为

  • BRE
  • ERE

RE字符集

RE将字符分为普通字符和元字符

字符 BRE/ERE 含义
\ Both 转义
. Both 匹配单个字符
* Both 匹配任意次,可以是0次。a*表示匹配任意多次a,.*表示任意字符串
^ Both 锚定匹配位置,从一行的行首开始
$ Both 锚定匹配位置,到一行的行尾
[…] Both 匹配中括号内的某个字符。x-y表示一个范围;[^…]表示不匹配中括号中的任意字符。[开括号后跟-或],-]转义为普通字符
\{n,m\} BRE 匹配次数为[n,m],\{n\}匹配n次,\{n,\}最小匹配次数为n
\( \) BRE 定义一个匹配位置,在后部可以引用该位置。例如,\(ab\).*\1表示ab字符串包夹了一个任意字符串。
\n BRE 引用已经定义的位置,可以从\1到\9
{n,m} ERE 与BRE的\{n,m\}相同
+ ERE 匹配至少1次
? ERE 匹配0或1次
| ERE
() ERE 匹配括号内的整个字符串

[ ]表达式是选择匹配中任意一个字符

  • c[aeiouy]t,匹配可以是cat、cet、cot等
  • [0123456789]表示为[0-9]

特别的

  • [[:alnum:]] 字符+数字
  • [[:alpha:]] 字符
  • [[:digit:]] 数字
  • [[:lower:]] 小写字符
  • [[:upper:]] 大写字符
  • [[:space:]] 空字符:空格、tab等

RE例子

[*\.], []*\.], [-*\.], []*\.-]

BRE: \(ab\)\(cd\)[def]*\2\1 abcdecdab

BRE: \(why\).*\1 whyXXwhy

\([[:alpha:]_][[:alnum:]_]*\) = \1 c语言赋值语句

^ABC

Def$

vi的正则表达式搜索与替换

首先检查magic变量,一般是magic

  • :set magic?

/或?

  • 后跟一个RE表达式
替换

:range s/from/to/flags

range表示行范围,%是全局所有行

  • 1,$表示从1行到尾行

flags为g表示这一行中所有的匹配项都替换

:%s/from/to/g最常用