1. 程式人生 > >正則表示式 進階(一)-- 匹配多連續字元、位置匹配、子表示式使用

正則表示式 進階(一)-- 匹配多連續字元、位置匹配、子表示式使用

之前一篇博文正則表示式 入門講了下正則表示式的一些基本使用,這次講一下高階的。還是那句話,要多用,才能夠記住並留在你的大腦皮層。

1. 匹配一個或多個連續字元

用+符號, a+,意思是匹配1個或多個字元a;[0-9]+,意思是匹配一個或多個數字

在vim中 + 語法有點不同,要用 '\+',如左示例。

note:[\w.] == [\w\.],像.  + 這樣的元字元,在字符集中可以不轉義,但是轉義一下也沒問題。

      

* 用法跟+相同,但是匹配0個或多個連續字元

  匹配0或多個數字,然後跟著abc三個字母

? 匹配0個或1個字元(或字元集合)

 ?在vim中的語法也有點不同,要寫成 '\?',如左示例

另外,可以用{}來設定重複次數,例如

a{9}     匹配連續9個a [0-9]{9} 匹配連續9個數字字元 {2}      重複2次 {2,4}    重複2-4次 {2,}     重複至少2次,無上限       注意{}的用法在vim中也有點不同,左{前要加一個‘\’.

元字元的貪婪型和懶惰型版本

*           *? +           +? {n,}        {n,}?

                

上面是一個例子,左邊是貪婪模式,右邊本來的正則應該是<[Bb]>.*?<\/[Bb]>,但是好像vim不支援,就找了上面途中所示的方法,效果是一樣的,{-}的意思是最短匹配,注意{}在vim中的用法,要加一個\,再看下第3個例子,幫助理解。

2. 位置匹配

\b   匹配一個單詞的開頭或末尾 \B   不匹配一個單詞邊界   (這個vim也不支援,不演示了,不過notepad++支援,我試過) \<   匹配一個單詞的開頭   不是所有的編輯器都支援 \>   匹配一個單詞的結束        
要注意下3個匹配結果的不同,另外,\b不被vim支援,所以只能用後面兩種形式。 字母數字下劃線是作為單詞邊界的字元,因此那個+符號,其實跟空格沒啥區別。
^    匹配一個字串的開頭 $    匹配一個字串的結束    
很多正則表示式的實現都支援使用一些特殊的元字元去改變另外一些元字元的行為,用來啟動分行匹配模式的(?m)記號就是其中一個例子。分行匹配模式使得正則表示式引擎把行分隔符當作一個字串分隔符來對待。
在分行匹配模式下,^ 不僅匹配正常的字串開頭,還將匹配行分隔符(換行符)後的開始位置(這個位置不可見);類似地,$ 不僅匹配正常的字串結尾,還將匹配行分隔符(換行符)後面的結束位置。 在使用時,(?m)必須出現在整個模式的最前面,例如下面的例子:
在匹配模式前面加上(?m)後,vim又不支援了,我用notepad++重新嘗試了一下,(?m)加與不加效果好像沒啥區別,都能夠把3行註釋找出來。

3. 使用子表示式

attention 把必須匹配的情況考慮周全並寫出一個匹配結果符合預期的正則表示式很容易,但把不需要匹配的情況也考慮周全並確保它們都將被排除在匹配結果之外往往要困難得多 子表示式,用()來定義,在vim中要用\(\) 常見用途: 對重複次數元字元的作用物件做出精確的設定和控制; 對|操作符的OR條件做出準確的定義; 如有必要,子表示式還允許巢狀使用。   
上面的兩條正則的匹配結果是一樣的,但是右邊的例項使用了子表示式。    
'|'是正則裡的'或'運算子 上面兩個例子,右邊的將19|20作為一個子表示式,左邊的正則'|'將其兩邊的部分作為整體來看待,看成了19和20\d{2},因此左圖中之匹配到了19而不是完整的1988. 精確匹配ip,只有0-255才可以的,有下面幾種情況: 1)任何一個1位或2位數字 2)任何一個以1開頭的3位數字 3)任何一個以2開頭,第2位數字在0-4之間的3位數字 4)任何一個以25開頭,第3位數字在0-5之間的3位數字         
我擦,構造了一個有點長的正則表示式,給哥們來了個下面這個提示。
那條正則:\(\(\(\d\{1,2}\)\|\(1\d\{2}\)\|\(2[0-4]\d\)\|\(25[0-5]\)\)\.\)\{3}\(\(\d\{1,2}\)\|\(1\d\{2}\)\|\(2[0-4]\d\)\|\(25[0-5]\)\) 換用notepad++,如下匹配,只有1個合法ip 正則:\b(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\b
終於將所有不合法的ip排除在外了。
好吧,這篇暫時寫到這裡了,還有點東西,再寫一篇吧。 水平有限,如果有朋友發現錯誤,歡迎留言交流

相關推薦

表示式 -- 匹配連續字元位置匹配表示式使用

之前一篇博文正則表示式 入門講了下正則表示式的一些基本使用,這次講一下高階的。還是那句話,要多用,才能夠記住並留在你的大腦皮層。 1. 匹配一個或多個連續字元 用+符號, a+,意思是匹配1個或多個

表示式 -- 回溯引用前後查詢嵌入條件

回溯引用是指模式的後半部分引用在前半部分中定義的子表示式 回溯引用只能用來引用模式裡的子表示式 下面是一個回溯引用的例子     只能匹配H1                                            第8行是不合法的    第8行被成功的排除掉了。 \1 \2

C# Lambda 表示式

Lambda 表示式是一種可用於建立委託或表示式目錄樹型別的匿名函式。通過使用 lambda 表示式,可以寫入可作為引數傳遞或作為函式呼叫值返回的本地函式。 Lambda 表示式對於編寫 LINQ 查詢表示式特別有用。若要建立 Lambda 表示式,需要在 Lambda 運算

mysql mysql備份

mysql備份的目的: 實現災難恢復:誤操作、硬件故障、軟件故障、自然災害、黑客攻擊 註意的要點: 1、能夠容忍丟失多少數據 2、恢復數據所用的時間 3、備份需要的時間 4、是否對業務有影響 5、備份時服務器負載 備份類型 完全備份:備份整個

函數

並行 自己的 習題 文件 false 聲明 方式 關鍵字 true 1.命名空間 本質:存放名字與值的綁定關系 命名空間的分類:(1)全局命名空間(變量)->位於函數體外 (2)局部命名空間(變量)->

Redis高級

具體類 tro 類型 長度 刪除過期數據 專用 影響 生活 設置時間 一、redis中的事務 在關系型數據庫中事務是必不可少的一個核心功能,生活中也是處處可見,比如我們去銀行轉賬,首先需要將A賬戶的錢劃走,然後存到B賬戶上,這兩個步驟必須在同一事務中,要麽都執行,要麽都不執

jmeter 表達式學習

特定 post 隨機 align pro pos 英文 第一個 cnblogs jmeter自帶後置處理器:正則表達式提取器,可以用來提取接口響應裏的信息,給予後續接口傳參用。 例如要提取響應結果裏的token字段及sex字段(響應內容為: "token":"83EE

表達式儲備

space mail 定位 per 操作 命名 打印字符 ron lower 正則表達式用途及概念 正則表達式,又稱規則表達式,通常被用來檢索、替換那些符合某個模式(規則)的文本。是對字符串(包括普通字(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”))操作的一

SQL ServerT-SQL查詢和編程的背景

.com src 編程 server 分享 bubuko 進階 分享圖片 img SQL Server進階(一)T-SQL查詢和編程的背景

Redis高階

一、redis中的事務 在關係型資料庫中事務是必不可少的一個核心功能,生活中也是處處可見,比如我們去銀行轉賬,首先需要將A賬戶的錢划走,然後存到B賬戶上,這兩個步驟必須在同一事務中,要麼都執行,要麼都不執行,不然錢憑空消失了,換了誰也無法接受。 同樣,redis中也為我們提供了事務,原理是:先把一組同一事

SpringCloud從入門到——懂生活就懂微服務

避免 發現 官方文檔 隨著 並發 規範 只需要 組合 組件 內容   本文通過生活中的實際場景解釋單體應用和微服務應用的關系,以及SpringCloud中各組件的功能和含義。 適合人群   Java開發人員 說明   轉載請說明出處:SpringCloud從入門到進階(一)

Servlet第一個JSP頁面

前言       本章講解JSP的相關知識之JSP初步 方法 1.概念 在以前我們寫網頁的時候,都是用html進行書寫,這種網頁是靜態的,無法和伺服器進行一個互動,那麼怎麼辦呢?JSP技術應運而生,我們在web開發之中,Java和Jsp可以形成完美的

JavaScriptJS事件機制

前言       做了這麼久的鋪墊,終於迎來了新的篇章,該章介紹JS中的事件機制 方法 1.概念 我們知道,JS是參與網頁互動的一門指令碼語言,之前所說的都是JS的基本概念,那麼怎麼來進行互動呢!那就需要JS的事件機制來進行控制了,如按鈕的點選事件觸

Android: Launcher啟動過程

1.前言 最近一直在看 《Android進階解密》 的一本書,這本書編寫邏輯、流程都非常好,而且很容易看懂,非常推薦大家去看看(沒有收廣告費,單純覺得作者寫的很好)。 今天就將 Launcher 系統啟動過程 總結一下(基於Android 8.0 系統)。 文章

c語言指標

指標也是一種資料型別 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。 1)指標是一種變數,佔有記憶體空間,用來儲存記憶體地址

egg.js-基於koa2的node.js

一、路由進階Egg路由的路由重定向,路由分組 在router.js修改為如下格式require引用 module.exports = app => { const { router, controller } = app; require('./routers/admin')(app); re

python3.5-------------------網路通訊ip埠,socket

1. ip地址:如198.168.1.1 ,用於在網路中標記區分每臺電腦,在本地區域網中是唯一的。window下程式->cmd->輸入ipconfig(檢視ipv4就是ip地址)。拓展:ip v4表示ip的第四個版本,目前出現了ipv6,ipv1/2/3/5都

PyQt5——讓視窗裝載更的控制元件

1. QTabWidget的使用 視窗上側有標籤,選擇不同標籤進入不同佈局頁面 import sys from PyQt5.QtWidgets import * class TabDemo(QTabWidget): def __init__(self, parent=No

Android----MVP架構

相信大家一定在用mvp架構去設計App,但是在設計運用的過程中,大家有沒有考慮簡化程式碼,View層和Model層會有很多重複的程式碼,在顯示資料之前還需每次判斷View!=null,Presenter層每次需要去new Model層的例項,View層還有可能會對應多個Presenter

java:泛型

1、泛型簡介 所謂泛型,即通過引數化型別來實現在同一份程式碼上操作多種資料型別,泛型程式設計是一種程式設計正規化,他利用“引數化型別”將型別抽象化,從而實現更為靈活的複用。 先簡單給個例子: //可以想象這裡的T為Integer型別,以便於理解,其實它可以是任何型別 p