Chapter 18. Regular Expressions

翻译文章:http://www.tldp.org/LDP/abs/html/x17129.html。PS:结合有道翻译与自己的修改

表达式是一串字符。那些具有不仅仅表示字面意义的字符串被称为元字符。例如,引用符号可以表示一个人的话,或者是后面符号的解释。正则表达式是匹配(或指定)模式的字符和元字符,字符或者元字符。

一个正则表达式包含一个或多个以下内容:

  • 一个字符集。这些字符保留其字面意义。最简单的正则表达式类型只包含一个字符集,没有元字符。
  • 一个锚。这些指定(锚)在文本中来规定正则表达式匹配的位置。例如, ^ 和 $ 都是锚。
  • 修饰符。这些修饰符来规定正则表达式匹配的范围。修饰符包括星号、括号和反斜杠。
正则表达式的主要用途是文本搜索和字符串操作。匹配单个字符或一组字符,一个字符串或字符串的一部分。
  • 星号 *:匹配前面的子表达式零次或多次。
“1133*” 匹配11 + 一个或者多个3的:113,1133,1133333,等等。
  • 点   .:匹配任何一个字符,除了换行符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
“13.“ 匹配13 + 至少一个字符(包括空格):1133,11333,但不是13(额外字符丢失)。
  • 插入 ^:匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 
  • 美元 $:匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 “XXX$”在一行末尾匹配 XXX。“^$”匹配空行。
  • 方括号 […]:将一组字符封装在一个单独的 RE 中。
“[xyz]” 匹配任何一个字符 x、y 或 z。
“[c-n]” 匹配范围 c 到 n 的任意一个字符。
“[B-Pk-y]” 匹配范围 B 到 P 和 k 到 y 的任意一个字符。
“[a-z0-9]” 匹配任何一个小写字母或任何数字。
“[^b-d]” 匹配任何字符除在b-d。
括号字符的组合序列可以匹配常见的单词模式。
"[Yy][Ee][Ss]"匹配,yes, Yes, YES, yEs,等等。
“[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]“匹配任何社会安全号码。
  • 反斜杠 \:转义了一个特殊字符,这意味着字符被逐字解释(因此不再是特殊的)。
A“\$” 返回其字面意义的“$”,而不是它的匹配输入字符串的结束位置。同样,“\\” 有 “\” 的字面意思。
  • 尖括号 \<…\>:标记单词边界。
尖括号必须被转义,否则它们只有字面意义。
“\<the\>” 与 “the” 匹配,而不是“them”、“there”、“other”等词。

扩展的正则表达式:额外的元字符添加到基本集合。用 egrep,awk 和 Perl。
  • 问号 ?:匹配0个或前一个RE,通常用于匹配单个字符。
  • 加号 +:匹配一个或多个前一个RE,它提供与 * 相似的功能,但不匹配0次事件。
  • 花括号 \{\}:前面匹配的个数。
必须转义花括号,否则它们只有字面意义。这种用法并不是基础规则的一部分。
“[0-9]\{5\}” 恰好匹配5位数字(字符在0到9之间)。
花括号在 awk 的“经典”(非posix兼容)版本中不可用。然而,GNU扩展版 awk, gawk,有--re-interval选项允许它们(可以不被转义)。
bash$ echo 2222 | gawk --re-interval '/2{3}/'
2222
Perl 和一些 egrep 版本不需要逃避花括号。
  • 括号 ():附带一组res。用于下列 “|” 操作符和 expr 子串提取。
  • 或者 |:匹配任何一组替换字符。
bash$ egrep 're(a|e)d' misc.txt
People who read seem to be better informed than those who do not.
The clarinet produces sound by the vibration of its reed.

一些版本的 sed、ed 和 ex 支持扩展正则表达式的版本,与 GNU 实用程序相同。

POSIX Character Classes. [:class:]:这是指定匹配字符范围的替代方法。
[:alnum:] 匹配字母或数字字符。这相当于A-Za-z0-9。
[:alpha:] 匹配字母字符。这相当于a-zA-Z。
[:blank:] 匹配空格或 tab。
[:cntrl:} 匹配控制字符。
[:digit:] 匹配(十进制)数字。这等于0-9。
[:graph:] 在 ASCII 码 33 - 126 范围内匹配字符。这和[:print:]一样,但不包括空格字符。
[:lower:] 匹配小写字母字符。这等价于a-z。
[:print:] 匹配 ASCII 32 - 126 范围内的字符。这与[:graph:]相同,但包括了空格字符。
[:space:] 匹配空格字符(空格和水平 tab)。
[:upper:] 匹配大写字母字符。这等价于A-Z。
[:xdigit:] 匹配十六进制数字。这相当于0-9A-Fa-f。

POSIX 字符类通常需要引用双括号 [[]]。
bash$ grep [[:digit:]] test.file
abc=723
     
# ...
if [[ $arow =~ [[:digit:]] ]]   #  Numerical input?
then       #  POSIX char class
  if [[ $acol =~ [[:alpha:]] ]] # Number followed by a letter? Illegal!
# ...
# From ktour.sh example script.

在一定程度上,这些字符类甚至可能与 globbing 一起使用。
bash$ ls -l ?[[:digit:]][[:digit:]]?
-rw-rw-r--    1 bozo  bozo         0 Aug 21 14:47 a33b

Sed、awk 和 Perl 在脚本中用作筛选器,在“筛选”或转换文件或I/O流时用作参数。      
Sed 和 awk 比较复杂,建议去阅读书籍。

注释:
[1]meta-meaning:元意义是一个术语,表达在更高抽象层次上的意义。例如,正则表达式的字面意思是一个符合接受用法的普通表达式。在本章中详细讨论的元意义是截然不同的。
[2]由于 sed、awk 和 grep 处理单行,通常不会有新行匹配。在多行表达式中有换行的情况下,'.' 点将与换行符匹配。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值