正則表達式-Regular expression學習筆記

正則表達式

正則表達式(Regular expression)是一種符號表示法,被用來識別文本模式。git

最近在學習正則表達式,今天整理一下其中的一些知識點正則表達式

grep - 打印匹配行

grep 是個很強大的程序,用來找到文件中的匹配文本。這樣使用 grep 命令:shell

grep pattern [file...]

當 grep 遇到一個文件中的匹配」模式」,它會打印出包含這個類型的行。(可使用正則表達式)express

grep 程序以這樣的方式來接受選項和參數:bash

grep [options] regex [file...]

grep選項

選項 描述
-i 忽略大小寫。不會區分大小寫字符。也可用--ignore-case 來指定。
-v 不匹配。一般,grep 程序會打印包含匹配項的文本行。這個選項致使 grep 程序只會打印不包含匹配項的文本行。也可用--invert-match 來指定。
-c 打印匹配的數量(或者是不匹配的數目,若指定了-v 選項),而不是文本行自己。 也可用--count 選項來指定。
-l 打印包含匹配項的文件名,而不是文本行自己,也可用--files-with-matches 選項來指定。
-L 類似於-l 選項,可是隻是打印不包含匹配項的文件名。也可用--files-without-match 來指定。
-n 在每一個匹配行以前打印出其位於文件中的相應行號。也可用--line-number 選項來指定。
-h 應用於多文件搜索,不輸出文件名。也可用--no-filename 選項來指定。

正則表達式元字符由如下字符組成:學習

^ $ . [ ] { } - ? * + ( ) | \

. 任何字符

圓點字符,其被用來匹配任意字符。若是咱們在正則表達式中包含它, 它將會匹配在此位置的任意一個字符。spa

錨點 ^--開頭 $--結尾

在正則表達式中,插入符號和美圓符號被看做是錨點。這意味着正則表達式 只有在文本行的開頭或末尾被找到時,纔算發生一次匹配。code

grep -h '^zip' dirlist*.txt  
#以zip開頭的文件
$ grep -h 'zip$' dirlist*.txt
#以zip結尾的文件
$ grep -h '^zip$' dirlist*.txt
#名字爲zip的文件

中括號表達式和字符類

除了可以在正則表達式中的給定位置匹配任意字符以外,經過使用中括號表達式, 咱們也可以從一個指定的字符集合中匹配單個字符。經過中括號表達式,咱們可以指定 一個待匹配字符集合(包含在不加中括號的狀況下會被解釋爲元字符的字符)。orm

插入字符(^)

若是在中括號表示式中的第一個字符是一個插入字符(^),則剩餘的字符被看做是不會在給定的字符位置出現的 字符集合。ip

插入字符若是是中括號表達式中的第一個字符的時候,纔會喚醒否認功能;不然,它會失去 它的特殊含義,變成字符集中的一個普通字符。

字符字符(-)

[A-Z]

表示A到Z全部字母

[A-Za-z0-9]

表示全部大小寫字母和0-9數字

POSIX

字符集 說明
[:alnum:] 字母數字字符。在 ASCII 中,等價於:[A-Za-z0-9]
[:word:] 與[:alnum:]相同, 但增長了下劃線字符。
[:alpha:] 字母字符。在 ASCII 中,等價於:[A-Za-z]
[:blank:] 包含空格和 tab 字符。
[:cntrl:] ASCII 的控制碼。包含了0到31,和127的 ASCII 字符。
[:digit:] 數字0到9
[:graph:] 可視字符。在 ASCII 中,它包含33到126的字符。
[:lower:] 小寫字母。
[:punct:] 標點符號字符。在 ASCII 中,等價於:[-!"#$%&'()*+,./:;<=>?@[\]_`{|}~]
[:print:] 可打印的字符。在[:graph:]中的全部字符,再加上空格字符。
[:space:] 空白字符,包括空格、tab、回車、換行、vertical tab 和 form feed.在 ASCII 中, 等價於:[ \t\r\n\v\f]
[:upper:] 大寫字母。
[:xdigit:] 用來表示十六進制數字的字符。在 ASCII 中,等價於:[0-9A-Fa-f]

經過改變環境變量 LANG 的值,你能夠選擇讓你的系統使用傳統的(ASCII)排列規則這個 LANG 變量包含了語種和字符集。這個值最初由你安裝 Linux 系統時所選擇的安裝語言決定。

locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC=zh_CN.UTF-8
LC_TIME=zh_CN.UTF-8
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY=zh_CN.UTF-8
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER=zh_CN.UTF-8
LC_NAME=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
LC_TELEPHONE=zh_CN.UTF-8
LC_MEASUREMENT=zh_CN.UTF-8
LC_IDENTIFICATION=zh_CN.UTF-8
LC_ALL=

把這個 LANG 變量設置爲 POSIX,來更改 locale,使其使用傳統的 Unix 行爲。

export LANG=POSIX

經過把這條語句添加到你的.bashrc 文件中,可使這個更改永久有效。

基本正則表達式(BRE)

BRE 能夠辨別如下元字符:

^ $ . [ ] *

擴展正則表達式(ERE)

ERE 添加了如下元字符(以及與其相關的功能):

( ) { } ? + |

交替

添加 alternation,以豎槓線元字符爲標記

grep -Eh '^(bz|gz|zip)' dirlist*.txt

這個表達式將會在咱們的列表中匹配以「bz」,或「gz」,或「zip」開頭的文件名。

限定符

  • ? - 匹配零個或一個元素
echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
(555) 123-4567
  • *- 匹配零個或多個元素

像 ? 元字符同樣,這個 * 被用來表示一個可選的字符

與 ? 不一樣,匹配的字符能夠出現 任意屢次,不只是一次。

[[:upper:][:lower:] ]*
  • +- 匹配一個或多個元素

元字符的做用與 * 很是類似,除了它要求前面的元素至少出現一次匹配。

  • { } - 匹配特定個數的元素
限定符 意思
{n} 匹配前面的元素,若是它確切地出現了 n 次。
{n,m} 匹配前面的元素,若是它至少出現了 n 次,可是很少於 m 次。
{n,} 匹配前面的元素,若是它出現了 n 次或多於 n 次。
{,m} 匹配前面的元素,若是它出現的次數很少於 m 次。

總結

元 字 符 說明
* 0個或多個匹配
+ 1個或多個匹配(等於{1,})
? 0個或1個匹配(等於{0,1})
{n} 指定數目的匹配
{n,} 很多於指定數目的匹配
{n,m} 匹配數目的範圍( m不超過255)
相關文章
相關標籤/搜索