正则表达式:
又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。是一类字符所书写的模式,其中许多字符(元字符)不表示其字面意义,而是表达控制或通配等功能。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
语法:
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
如:/etc/passwd中以root开头的行,及其后面的两行
-A 2为OPTIONS,命令选项;^root为PATTERN,其中root为字面意思,^为元字符;/etc/passwd为FILE
正则表达式分类:
根据元字符数量及功能的不同分为基本正则表达式(grep)、扩展正则表达式(egrep)。grep和egrep都是文本搜索工具,可根据用户指定的文本模式(搜索条件,即:文本+元字符)对目标文件进行逐行搜索,显示能匹配到的行;用法上grep -E等同于egrep。此外还有一个文本搜索工具fgrep,不支持正则表达式,没有自己的元字符,不做详细解释。
在搜索工具中,元字符起到至关重要的作用;元字符即,不表示其字面意义,而用于额外功能性描述。
正则表达式元字符:
grep元字符:
1.字符匹配:
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符
[0-9], [[:digit:]]
[a-z], [[:lower:]]
[A-Z], [[:upper:]]
[[:space:]]匹配空白字符,包括空格,tab…
Space characters (such as space, tab, and formfeed, to name a few).
tab, newline, vertical tab, form feed, carriage return, and space.
[[:punct:]]匹配任意标点符号:: '! " # $ % & ' ( ) * + , – . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'.
Punctuation characters (characters that are not letter, digits, control characters, or space characters).
[[:alpha:]]字母数字符
Alphabetic characters.
[[:alnum:]]匹配任何字母
Alphanumeric characters.
[^]:代表本表达式不匹配"[]"内出现的字符
2.次数匹配元字符:
用于实现指定其前面的字符所能够出现的次数
*: 任意长度,它前面的字符可以出现任意次
\?: 0次或1次,它前面的字符是可有可无的
\{m\}: m次,它前的字符要出现m次
\{m,n\}: 至少m次,至多n次
\{m,\}:至少m次
\{0,n\}: 至多n次
.*:任意长度的任意字符
3.位置锚定:
^: 行首锚定;写在模式最左侧
$: 行尾锚定:写在模式最右侧
^$: 空白行
4.分组:
\(\)
例如:\(ab\)*
分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用
5.引用:
例如\(ab\(x\)y\).*\(mn\)
有编号:自左而后的左括号,以及与其匹配右括号
\(a\(b\(c\)\)mn\(x\)\).*\1
\#: 引用第n个括号所匹配到的内容,而非模式本身
例如:
引用第一个分组的内容为\(w\(es\)t\)
引用第二个分组的内容为\(es\)
也可以看出正则表达式是工作在贪婪模式下,会尽可能多的匹配
6.补充:
不包含特殊字符的连续字符组成的串叫单词:
\<: 词首,出现于单词左侧,\b
如:\<char
\>: 词尾,出现于单词右侧, \b
如:char\>
egrep元字符:
1.字符匹配:
.:任意单个字符
[]:匹配范围内的任意单个字符
[^]:匹配范围外的任意单个字符
2.次数匹配:
*:任意次
?: 0次或1次
+: 至少1次;
{m}: 精确匹配m次
{m,n}: 至少m次,至多n次
{m,}:至少m次
{0,n}:至多n次
3.锚定:
^:行首
$:行尾
^$, ^[[:space:]]*$:空白行
4.分组:
()
5.引用:
\1, \2, \3
6.或者:
a|b: a或者b
con(C|c)at
7.补充
\<, \b
\>, \b
grep与egrep区别
grep的扩充版本, 改良了许多传统 grep 不能或不便的操作. 比方说:
grep 之下不支持 ? 与 + 这两种 modifier, 但 egrep 则可.
grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可.
grep 在处理 {n,m} 时, 需用 \{ 与 \} 处理, 但 egrep 则不需.
fgrep:特别搜索
无元字符,字符表示字面意思。
命令选项:
-v: 反向选取,即不包含
-o: 仅显示匹配的字串,而非字串所在的行
-i: ignore-case,忽略字符大小写
-E: 支持使用扩展正则表达式
-A #:Print NUM lines of trailing context after matching lines.
-B #:Print NUM lines of leading context before matching lines.
-C #:Print NUM lines of output context. Places a line containing a group separator (–) between contiguous groups of matches.
根据马哥随笔,参考(http://www.178linux.com/archives/1198、http://blog.sina.com.cn/s/blog_51dc0fba0100lqu8.html)及度娘整理。
初次发博客,如有遗漏、错误烦请告知~
原创文章,作者:jiangyali518,如若转载,请注明出处:http://www.178linux.com/1983
评论列表(2条)
较上次好了很多,如果能加上段落的标识,代码的格式化,颜色的标识会更好.加油
@stanley:whatever,确实不足。感谢提点,会向您提的方向努力~感谢。