正則表達式:
又稱正規表示法、常規表示法(英語: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.www58058.com/archives/1198、http://blog.sina.com.cn/s/blog_51dc0fba0100lqu8.html)及度娘整理。
初次發博客,如有遺漏、錯誤煩請告知~
原創文章,作者:jiangyali518,如若轉載,請注明出處:http://www.www58058.com/1983
較上次好了很多,如果能加上段落的標識,代碼的格式化,顏色的標識會更好.加油
@stanley:whatever,確實不足。感謝提點,會向您提的方向努力~感謝。