Chapter 18. Regular Expressions

Posted zy_dream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 '/23/'
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 处理单行,通常不会有新行匹配。在多行表达式中有换行的情况下,'.' 点将与换行符匹配。


以上是关于Chapter 18. Regular Expressions的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 简单介绍

chapter18——PCA实现

Chapter 3 Phenomenon——18

Chapter 2 Open Book——18

Chapter 18_0 数学库

Head first java chapter 18 远程部署的RMI_分布式计算