正則表達式(9):擴展正則表達式

正則表達式(9):擴展正則表達式

      • 小結

本博文轉載自

前文中一直在說,在Linux中,正則表達式可以分為”基本正則表達式”和”擴展正則表達式”。

我們已經認識了”基本正則表達式”,現在,我們來認識一下”擴展正則表達式”。

有了之前的基礎,學習”擴展正則表達式”簡直不要太輕松。

之前說過,有些符號是通用的,不管是在”基本正則表達式”中,還是在”擴展正則表達式”中,這些通用的符號所表達的意思都是相同的。

那么,我們先來看看哪些符號是通用的,看完之后你會信心大增,如下字符都是通用的:

.   表示任意單個字符。
*  表示前面的字符連續出現任意次,包括0次。
.* 表示任意長度的任意字符,與通配符中的*的意思相同。
\  表示轉義符,當與正則表達式中的符號結合時表示符號本身。
[  ]表示匹配指定范圍內的任意單個字符。
[^  ]表示匹配指定范圍外的任意單個字符。[[:alpha:]]  表示任意大小寫字母。
[[:lower:]]  表示任意小寫字母。
[[:upper:]]  表示任意大寫字母。
[[:digit:]]  表示0到9之間的任意單個數字(包括0和9)。
[[:alnum:]]  表示任意數字或字母。
[[:space:]]  表示任意空白字符,包括"空格"、"tab鍵"等。
[[:punct:]]  表示任意標點符號。
[^[:alpha:]]  表示單個非字母字符。
[^[:lower:]]  表示單個非小寫字母字符。
[^[:upper:]]  表示單個非大寫字母字符。
[^[:digit:]]  表示單個非數字字符。
[^[:alnum:]]  表示單個非數字非字母字符。
[^[:space:]]  表示單個非空白字符。
[^[:punct:]]  表示單個非標點符號字符。
[0-9]與[[:digit:]]等效。
[a-z]與[[:lower:]]等效。
[A-Z]與[[:upper:]]等效。
[a-zA-Z]與[[:alpha:]]等效。
[a-zA-Z0-9]與[[:alnum:]]等效。
[^0-9]與[^[:digit:]]等效。
[^a-z]與[^[:lower:]]等效。
[^A-Z]與[^[:upper:]]等效
[^a-zA-Z]與[^[:alpha:]]等效
[^a-zA-Z0-9]與[^[:alnum:]]等效^:表示錨定行首,此字符后面的任意內容必須出現在行首,才能匹配。
$:表示錨定行尾,此字符前面的任意內容必須出現在行尾,才能匹配。
^$:表示匹配空行,這里所描述的空行表示"回車",而"空格"或"tab"等都不能算作此處所描述的空行。
^abc$:表示abc獨占一行時,會被匹配到。
\<或者\b :匹配單詞邊界,表示錨定詞首,其后面的字符必須作為單詞首部出現。
\>或者\b :匹配單詞邊界,表示錨定詞尾,其前面的字符必須作為單詞尾部出現。
\B:匹配非單詞邊界,與\b正好相反。

上述符號,在基本正則表達式中與擴展正則表達式中的用法完全相同。

有沒有感覺,70%都是通用的,那么我們來動手試試。

在總結grep命令時,我們提到過,grep命令默認只支持基本正則表達式,如果想要讓grep命令能夠支持擴展的正則表達式,則需要使用”-E”選項,示例如下

在這里插入圖片描述

上圖中,grep命令使用了”-E”選項,表示grep命令會把”正則表達式”中的符號當成”擴展正則表達式”去理解,而不再使用默認的”基本正則表達式”。

但是由于”[A-Z]”是通用的,所以,不管是否使用擴展正則表達式,”[A-Z]”都表示單個大寫字母。

剛才說過,70%的符號都是通用的,那么剩下的30%呢?

其實,剩下的30%也都差不多,與基本正則表達式相比,反而更加簡單了,不信?我們就來看看。

在基本正則表達式中,{n} 表示前面的字符連續出現n次,將會被匹配到。

在擴展正則表達式中,{n} 表示前面的字符連續出現n次,將會被匹配到。

在基本正則表達式中,( ) 表示分組,(ab) 表示將ab當做一個整體去處理。

在擴展正則表達式中,( ) 表示分組,(ab) 表示將ab當做一個整體去處理。

在寫法上,”擴展正則表達式”的寫法是不是更加簡練呢?示例如下

在這里插入圖片描述

如上圖所示,當使用”擴展正則表達式”時,在”書寫”方面,反而省力不少,最終匹配到的文本卻是相同的,是不是很方便?

看完了上述示例,我想你對擴展正則表達式應該已經有了一個初步的印象了。

那么,我們就來介紹一下,有哪些符號在”擴展正則表達式”中變得更加簡練了。

在擴展正則表達式中:

( ) 表示分組

(ab) 表示將ab當做一個整體去處理。

\1 表示引用整個表達式中第1個分組中的正則匹配到的結果。

\2 表示引用整個表達式中第2個分組中的正則匹配到的結果。

? 表示匹配其前面的字符0或1次

  • 表示匹配其前面的字符至少1次,或者連續多次,連續次數上不封頂。

{n} 表示前面的字符連續出現n次,將會被匹配到。

{x,y} 表示之前的字符至少連續出現x次,最多連續出現y次,都能被匹配到,換句話說,只要之前的字符連續出現的次數在x與y之間,即可被匹配到。

{,n} 表示之前的字符連續出現至多n次,最少0次,都會陪匹配到。

{n,}表示之前的字符連續出現至少n次,才會被匹配到。

看了上述總結以后,是不是已經想要放棄使用”基本正則表達式”了呢?因為與之相比,擴展正則表達式才更符合我們這些懶人的習慣,而且,擴展正則表達式的可讀性也更高,畢竟很多符號少了前面的”\”,可讀性就變強了。

擴展正則表達式中,還有一個常用的符號,它就是”|” (在基本正則表達式中使用 “\|”, 前面沒有講, 這里補上)

注:按住鍵盤的 “shift鍵” 和 “\”鍵 ,就可以打出”|”

“|”在擴展正則表達式中,表示”或”,這樣說不容易理解,我們來看個小例子,就能明白,示例文件內容如下。

在這里插入圖片描述

如果,我們想要從上例文本中找到以”com”結尾的行,我們該怎么辦呢?我們可以使用如下命令。

在這里插入圖片描述

同理,如果我們想要從示例文本中找出以”net”結尾的行,可以使用如下命令。

在這里插入圖片描述

那么,如果我們想要從示例文本找出,以”com”結尾,或者以”net”結尾的行,我們該怎么辦呢?

這時候,我們就需要用到”|”

“|”在擴展正則表達式中表示”或者”,所以,我們可以使用如下表達式

在這里插入圖片描述

上圖中的擴展正則使用了分組符號”( )”,”(com|net)”表示將括號內的內容看做一個整體,而括號內的內容為”com|net”,它表示”com或者net”,所以,”(com|net)$”就表示以com或者net結尾的行。是不是很簡單?

那么,我們就趁熱打鐵,通過實際練習,來熟悉一下”擴展正則表達式”吧。

仍然以剛才的示例文件作為測試文件,假設,我們想要查找出測試文本中的”合法郵箱”,我們應該怎么做呢?

既然是要找出”合法郵箱”,那么,我們則必須事先定義,滿足哪些條件的郵箱才屬于合法郵箱。

所以,我們規定,如果一個郵箱屬于合法郵箱,那么必須滿足如下條件。

1、郵箱字符串中必須包含”@”符。

2、”@”符前面的字符只能是小寫字母或數字,不能包含特殊符號。

3、”@”符前面的字符數量至少需要4個,至多為16個。

4、郵箱必須以”com”、”net”、”org”、”edu”等頂級域名結尾(此處為了方便演示,不判斷更多的域名)。

5、頂級域名之前必須包含一個”點”,換句話說就是,郵箱必須以”.com”、”.net”、”.org”、”.edu”結尾。

6、”@”與”.”之間的字符數量不能超過12個,不能低于2個。

7、”@”與”.”之間的字符只能是小寫字母或數字,不能包含特殊符號。

好了,了解了合法郵箱的規則以后,我們就可以開始編寫正則表達式了,我們可以使用如下正則,查找文本中的合法郵箱。

在這里插入圖片描述

如果你覺得上述正則稍微有些復雜,不容易理解,那么可以將其拆分成幾個部分去理解,拆分后的每一部分,可以與之前的”合法郵箱條件”一一對應,如下圖所示。

在這里插入圖片描述

這樣看,是不是容易理解多了,好了,趕快自己動手實驗一下吧。

小結

我認為,有了之前基礎的你,搞定”擴展正則表達式”,肯定是分分鐘的事情,所以,我們就對”擴展正則表達式”進行一下總結吧。

常用符號
.   表示任意單個字符。
*  表示前面的字符連續出現任意次,包括0次。
.* 表示任意長度的任意字符,與通配符中的*的意思相同。
\  表示轉義符,當與正則表達式中的符號結合時表示符號本身。
| 表示"或者"之意
[  ]表示匹配指定范圍內的任意單個字符。
[^  ]表示匹配指定范圍外的任意單個字符。單個字符匹配相關
[[:alpha:]]  表示任意大小寫字母。
[[:lower:]]  表示任意小寫字母。
[[:upper:]]  表示任意大寫字母。
[[:digit:]]  表示0到9之間的任意單個數字(包括0和9)。
[[:alnum:]]  表示任意數字或字母。
[[:space:]]  表示任意空白字符,包括"空格"、"tab鍵"等。
[[:punct:]]  表示任意標點符號。
[^[:alpha:]]  表示單個非字母字符。
[^[:lower:]]  表示單個非小寫字母字符。
[^[:upper:]]  表示單個非大寫字母字符。
[^[:digit:]]  表示單個非數字字符。
[^[:alnum:]]  表示單個非數字非字母字符。
[^[:space:]]  表示單個非空白字符。
[^[:punct:]]  表示單個非標點符號字符。
[0-9]與[[:digit:]]等效。
[a-z]與[[:lower:]]等效。
[A-Z]與[[:upper:]]等效。
[a-zA-Z]與[[:alpha:]]等效。
[a-zA-Z0-9]與[[:alnum:]]等效。
[^0-9]與[^[:digit:]]等效。
[^a-z]與[^[:lower:]]等效。
[^A-Z]與[^[:upper:]]等效
[^a-zA-Z]與[^[:alpha:]]等效
[^a-zA-Z0-9]與[^[:alnum:]]等效次數匹配相關
?  表示匹配其前面的字符0或1次
+  表示匹配其前面的字符至少1次,或者連續多次,連續次數上不封頂。
{n} 表示前面的字符連續出現n次,將會被匹配到。
{x,y} 表示之前的字符至少連續出現x次,最多連續出現y次,都能被匹配到,換句話說,只
要之前的字符連續出現的次數在x與y之間,即可被匹配到。
{,n} 表示之前的字符連續出現至多n次,最少0次,都會陪匹配到。
{n,}表示之前的字符連續出現至少n次,才會被匹配到。位置邊界匹配相關
^:表示錨定行首,此字符后面的任意內容必須出現在行首,才能匹配。
$:表示錨定行尾,此字符前面的任意內容必須出現在行尾,才能匹配。
^$:表示匹配空行,這里所描述的空行表示"回車",而"空格"或"tab"等都不能算作此處所描述的空行。
^abc$:表示abc獨占一行時,會被匹配到。
\<或者\b :匹配單詞邊界,表示錨定詞首,其后面的字符必須作為單詞首部出現。
\>或者\b :匹配單詞邊界,表示錨定詞尾,其前面的字符必須作為單詞尾部出現。
\B:匹配非單詞邊界,與\b正好相反。分組與后向引用
( ) 表示分組,我們可以將其中的內容當做一個整體,分組可以嵌套。
(ab) 表示將ab當做一個整體去處理。
\1 表示引用整個表達式中第1個分組中的正則匹配到的結果。
\2 表示引用整個表達式中第2個分組中的正則匹配到的結果。

那么什么時候使用基本正則表達式、什么時候使用擴展正則表達式呢?
這是一個仁者見仁的話題, 個人認為:
當出現2處或者2處以上使用“\”(反斜桿轉義)的正則, 則使用擴展正則。

基本正則表達式與擴展正則表達式的區別:
區別主要是有幾個部分可以不使用反斜桿轉義.
如下:

1. 分組;  
基本正則表達式: \(\)
擴展正則表達式: ()2. 或
基本正則表達式: \|
擴展正則表達式: |3. 次數匹配相關
基本正則表達式:
\?  表示匹配其前面的字符0或1次
\+  表示匹配其前面的字符至少1次,或者連續多次,連續次數上不封頂。
\{n\} 表示前面的字符連續出現n次,將會被匹配到。
\{x,y\} 表示之前的字符至少連續出現x次,最多連續出現y次,都能被匹配到,換句話說,只要之前的字符連續出現的次數在x與y之間,
即可被匹配到。
\{,n\} 表示之前的字符連續出現至多n次,最少0次,都會陪匹配到。
\{n,\}表示之前的字符連續出現至少n次,才會被匹配到。擴展正則表達式:
?  表示匹配其前面的字符0或1次
+  表示匹配其前面的字符至少1次,或者連續多次,連續次數上不封頂。
{n} 表示前面的字符連續出現n次,將會被匹配到。
{x,y} 表示之前的字符至少連續出現x次,最多連續出現y次,都能被匹配到,換句話說,只
要之前的字符連續出現的次數在x與y之間,即可被匹配到。
{,n} 表示之前的字符連續出現至多n次,最少0次,都會陪匹配到。
{n,}表示之前的字符連續出現至少n次,才會被匹配到。

關于”擴展正則表達式”,就總結到這里,希望能夠幫助到你~~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211251.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211251.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

T天池SQL訓練營(五)-窗口函數等

–天池龍珠計劃SQL訓練營 5.1窗口函數 5.1.1窗口函數概念及基本的使用方法 窗口函數也稱為OLAP函數。OLAP 是OnLine AnalyticalProcessing 的簡稱&#xff0c;意思是對數據庫數據進行實時分析處理。 為了便于理解&#xff0c;稱之為窗口函數。常規的SELECT語句都是對整張表進…

Unity由“鼠標點不準物體”引發的Camera的相關思考

問題 前段一個同事在使用Unity開發時遇到一個奇怪的問題&#xff0c;使用左鍵點擊發射射線的方式選擇物體&#xff0c;總是選不準&#xff0c;尤其是小的物體&#xff0c;鼠標點擊到物體上&#xff0c;有時能選上&#xff0c;有時選不上&#xff0c;偶爾點擊到物體旁邊…

Tensorflow.js 入門學習指南

Tensorflow.js 入門學習指南 官方地址TensorFlow.js (google.cn) Tensorflowjs是一個機器學習框架&#xff0c;使用 TensorFlowJS 可以創建生產級機器學習模型 安裝包 瀏覽器設置 您可以通過兩種主要方式在瀏覽器項目中獲取 TensorFlow.js&#xff1a; 使用腳本代碼。從 NPM…

基于MATLAB車輛防碰撞系統仿真

摘要 近年來&#xff0c;汽車行業的飛速發展使得我國的汽車保有量快速增長&#xff0c;但由此引發的交通事故導致的人員傷亡數量仍居高不下。從保護人身安全和降低交通事故發生的可能性的角度出發&#xff0c;車輛防碰撞系統能夠使駕駛員在沒注意到與前方車輛有碰撞危險的情況下…

Python:核心知識點整理大全11-筆記

目錄 ?編輯 6.2.4 修改字典中的值 6.2.5 刪除鍵—值對 注意 刪除的鍵—值對永遠消失了。 6.2.6 由類似對象組成的字典 6.3 遍歷字典 6.3.1 遍歷所有的鍵—值對 6.3.2 遍歷字典中的所有鍵 往期快速傳送門&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

風力發電對講 IP語音對講終端IP安防一鍵呼叫對講 醫院對講終端SV-6005網絡音頻終端

風力發電對講 IP語音對講終端IP安防一鍵呼叫對講 醫院對講終端SV-6005網絡音頻終端 目 錄 1、產品規格 2、接口使用 2.1、側面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、產品規格 輸入電源&#xff1a; 12V&#xff5e;24V的直流電源 網絡接口&am…

前端知識庫Html5和CSS3

1、常見的水平垂直居中實現方案 最簡單的方案是flex布局 .container{display: flex;align-items: center;justify-content: center; }絕對定位配合margin:auto(一定要給.son寬高) .father {position: relative;height: 300px; } .son {position: absolute;top: 0;right: 0;b…

PID控制參數整定(調節方法)原理+圖示+MATLAB調試

PID控制參數整定&#xff08;調節方法&#xff09;原理圖示MATLAB調試 Chapter1 PID控制參數整定&#xff08;調節方法&#xff09;原理圖示MATLAB調試序一、P參數選取二、I的調節三、D的調節四、總結 Chapter2 PID參數調整&#xff0c;個人經驗&#xff08;配輸出曲線圖&#…

【51單片機系列】獨立按鍵介紹

本文是關于獨立按鍵的介紹及使用。首先介紹了按鍵&#xff0c;包括什么是按鍵及使用按鍵時如何實現軟件消抖。然后使用proteus仿真實現獨立按鍵控制LED指示燈的操作。 之前的LED、蜂鳴器、數碼管中IO口都是作為輸出使用&#xff0c;這里通過獨立按鍵實驗介紹IO口作為輸入的使用…

Edge 中的msedgewebview2總想聯網

目錄預覽 一、問題描述二、原因分析三、解決方案四、參考鏈接 一、問題描述 使用Edge瀏覽器的時候&#xff0c;右下角火絨總會彈出“msedgewebview2”想要聯網的彈窗&#xff0c;如下 點擊發起程序&#xff0c;找到路徑如下&#xff1a; C:\Program Files (x86)\Microsoft\…

zabbix 進階

zabbix的字段發現機制&#xff1a; zabbix客戶端主動和服務端聯系&#xff0c;將自己的地址和端口發送服務端實現字段添加監控主機。 客戶端是主動一方。 缺點&#xff1a;自定義網段中主機數量太多&#xff0c;登記耗時會很久&#xff0c;而且這個自動發現機制不是很穩定。…

centos6.8下載地址

Index of /centos-store/6.8/isos/x86_64/ (liu.se) archive.kernel.org : http - rsynclinuxsoft.cern.ch : http - rsyncmirror.nsc.liu : http - rsync

被遺忘的書籍

C-被遺忘的書籍_牛客小白月賽82 (nowcoder.com) #include <iostream> #include <queue> #include <string> #include <stack> #include <vector> #include <set> #include <map> #include <unordered_map> #include <unor…

計組中各種透明性總結

虛擬存儲器&#xff0c;對應用程序員不可見。主存- cache層由硬件自動完成&#xff0c;對程序員不可見。cache純硬件&#xff0c;程序員不可見。內存&#xff0c;對程序員可見。知識點來源&#xff1a;王道模擬第六套主存-輔存層由硬件和操作系統共同完成&#xff0c;對應用程序…

【Docker一】Docker架構、鏡像操作和容器操作

一、docker基本管理和概念 1、概念 docker&#xff1a;開源的應用容器引擎。基于go語言開發的。運行在Linux系統中的開源的輕量級的“虛擬機” docker的容器技術可用在一臺主機上輕松到達為任何應用創建一個輕量級到的&#xff0c;可移植的&#xff0c;自給自足的容器 dock…

免費的數據采集軟件,最新免費的幾款數據采集軟件【2024】

在當今數字化時代&#xff0c;數據是企業決策和業務發展的關鍵。而如何高效獲取數據成為許多企業和研究機構的關注焦點。本文將深入探討數據采集軟件的種類。幫助大家選擇最適合自己需求的數據采集工具。 數據采集軟件種類 在眾多數據采集軟件中&#xff0c;有一類強大而多樣…

postgresql自帶指令命令系列二

簡介 在安裝postgresql數據庫的時候會需要設置一個關于postgresql數據庫的PATH變量 export PATH/home/postgres/pg/bin:$PATH&#xff0c;該變量會指向postgresql安裝路徑下的bin目錄。這個安裝目錄和我們在進行編譯的時候./configure --prefix [指定安裝目錄] 中的prefix參…

跨境電商運營常用的ChatGPT通用提示詞模板

市場分析&#xff1a;如何分析目標市場&#xff1f; 選品策略&#xff1a;如何選擇要銷售的商品&#xff1f; 供應鏈管理&#xff1a;如何管理供應鏈&#xff1f; 物流解決方案&#xff1a;如何選擇合適的物流解決方案&#xff1f; 跨國支付&#xff1a;如何處理跨國支付&a…

labelimg遇到的標簽修改問題:修改一張圖像的標簽時,保存后導致classes.txt改變

問題描述&#xff1a;修改一張圖像的標簽時候&#xff0c; classes.txt 會同步更新&#xff0c;導致重新生成了 classes.txt 但是這個 classes.txt 只有你現在寫的那個類別名&#xff0c;以前的沒有了。 解決&#xff1a;設置一個 predefined_classes.txt&#xff0c;內容和模…

Metasploit滲透測試的漏洞利用和攻擊方法

預計更新 第一章 Metasploit的使用和配置 1.1 安裝和配置Metasploit 1.2 Metasploit的基礎命令和選項 1.3 高級選項和配置 第二章 滲透測試的漏洞利用和攻擊方法 1.1 滲透測試中常見的漏洞類型和利用方法 1.2 Metasploit的漏洞利用模塊和選項 1.3 模塊編寫和自定義 第三章 Me…