1. 程式人生 > >正則表示式學習筆記(三)——高階技巧

正則表示式學習筆記(三)——高階技巧

注意很多正則表示式的實現並不一定支援這些這些功能,或是實現的方式有變化

一、重複匹配

1、匹配一個或多個字元

要想匹配同一個字元(或字元集合)的多次重複,只要簡單地給這個字元(或字元集合)加上一個 + 字元作為字尾就行了。

2、匹配零個或多個字元

匹配一個字元(或字元集合),該字元可以出現零次或多次,只要給這個字元(或字元集合)加上一個 * 字元作為字尾就行了。

3、匹配零個或一個字元

匹配一個字元(或字元集合),該字元可以出現零次或一次,只要給這個字元(或字元集合)加上一個 ? 字元作為字尾就行了。

4、匹配的重複次數

指定字元(或字元集合)的重複次數:[A-Fa-f0-9]{6}   匹配[A-Fa-f0-9]出現6次

為重複匹配次數設定一個區間:        [A-Fa-f0-9]{3,6}   匹配[A-Fa-f0-9]出現最少3次,最多6次

 [A-Fa-f0-9]{6,}   匹配[A-Fa-f0-9]出現最少6次

5、防止過度匹配

在沒有指定重複次數的上限值時,有事可能會導致過度匹配的現象。

如:

原文: <B> tst1 </B>  <B> tst2 </B>           

正則表示式:<B>.*</B>      匹配結果:<B> tst1 </B>  <B> tst2 </B>      過度匹配 ,一個結果

出現這種情況的原因:   * 和 +  都是所謂的 “ 貪婪型 ” 元字元,在進行匹配時的行為模式是多多益善,會盡可能從一段文字的開頭一直匹配到這段文字的末尾。

正則表示式:<B>.*?</B>     

匹配結果:<B> tst1 </B>  

      <B> tst2 </B>        兩個匹配結果

解決辦法:  使用懶惰模式,在進行匹配時的行為模式是適可而止,從這段文字的開頭匹配碰到第一個匹配時為止。

使用方法:  給貪婪型元字元加上一個 ? 字尾即可

二、位置匹配

1、邊界

(1) 單詞邊界 

由限定符\b指定的單詞邊界

 \b 用來匹配一個單詞的開始或結尾   \b匹配的是一個位置,這個位置位於一個能夠用來構成單詞的字元(\w)和一個不能用來構成單詞的字元(\W)之間。

例子:   

\bcat\b   匹配  cat 單詞

\bcat      匹配  cat開頭的單詞

cat\b      匹配  cat結尾的單詞

\B  表明不匹配一個單詞邊界:即字母數字下劃線之間,或者非字母數字下劃線之間

(2)字串邊界

^\s*<\?xml.*\?>     匹配xml檔案的開頭,<?xml version="1.0" encoding="UTF-8"?>  

^\s*  解決了<?xml>標籤前允許有空格、製表符、換行符等空白字元

</[Hh][Tt][Mm][Ll]>\s*$      匹配</html>標籤       \s*$ 解決</html>標籤後面不應該有任何實際內容

$       匹配輸入字串的結束位置

^     匹配輸入字串的開始位置

(3)分行匹配模式

(?m)記號就是一個能夠改變其他元字元行為的字串序列。

分行匹配模式:

1、將行分隔符當做一個字串分隔符來對待

2、 ^  不僅匹配正常字串開頭,還將匹配行分隔符後面的開始位置

3、 $   不僅匹配正常字串結尾,還將匹配行分隔符後面的結束位置

使用時,(?m)必須出現在整個模式的最前面

例子:

(?m)^\s*\/\/.*$   匹配//開頭的行  匹配註釋

\/\*(.*\n)*?\*\/   匹配/**/註釋

注意: 很多正則表示式引擎不支援(?m)

三、使用子表示式

1、子表示式

子表示式是一個更大的表示式的一部分,把一個表示式劃分為一個系列子表示式的目的是為了把哪些子表示式當做一個獨立元素來使用。

格式:  子表示式必須用   (    和    )  括起來

2、子表示式的巢狀

子表示式允許多重巢狀,這種巢狀的層次在理論上沒有限制,但還是應該遵循適可而止的原則。

絕大多數巢狀子表示式沒有它們看上去那麼複雜。

注意:  把必須匹配的情況考慮周全並寫出一個匹配結果符合預期的正則表示式很容易,但把不需要匹配的情況也考慮周全並確保它們被排除在

             匹配結果之外往往要困難得多。

在分析各個子表式的時候,應該按照先內後外的原則。

四、回溯引用:前後一致匹配

1、回溯引用匹配

回溯引用允許正則表示式模式引用前面的匹配結果。

回溯引用指的是模式的後半部分引用在前半部分中定義的子表示式。

例子:

正則表示式:\s*(\w+)\s*\1    匹配相鄰的兩個相同的單詞

\1  代表了正則表示式裡的第1個子表示式,  \2 代表著第2個子表示式,依次類推

2、回溯引用在替換操作中的應用

例子1:

Hello, [email protected] is my email adress

正則表示式:(\w+[\w\.]*@[\w\.]+\.\w+)

替換: <A href="mailto:$1">$1</A>

結果:Hello, <A href="mailto:$1">$1</A> is my email adress

$1 為匹配的第一個子表示式的匹配內容

提示:  同一個子表示式可以被引用任意次數—— 只要在需要用到它的地方寫出它的回溯引用就行了。

注意:  回溯引用語法在不同的正則表示式實現由很大差異

例子2:

313-555-1234

正則表示式:(\d{3})(-)(\d{3})(-)(\d{4})

替換:    ($1)$3-$5

結果:(313)555-1234

提示:  在對文字進行重新排版的時候,把文字分解成多個子表示式的做法往往非常有用,

這可以讓我們對文字的排版效果做出更精確的控制。

五、前後查詢

1、向前查詢和向後查詢

例子1:

<html> this is a test </html>

正則表示式: (?<=<html>).*(?=</html>)

結果: this is a test

?=     向前查詢指定了一個必須匹配但不在結果中返回的模式

一個向前查詢模式其實就是一個以 ?= 開頭的子表示式,需要匹配的文字跟在 = 的後面

?<=     向後查詢指定了一個必須匹配但不在結果中返回的模式

一個向後查詢模式其實就是一個以 ?<= 開頭的子表示式,需要匹配的文字跟在 = 的後面


注意: 查詢中的前、後指模式與被查詢文字的相對位置而言,左為前。

2、對前後查詢取非

負向前查詢:將向前查詢不與給定模式相匹配的文字。   (?!)

負向後查詢:將向後查詢不與給定模式相匹配的文字。   (?<!)

例子:

I paid $30  for 100 apples,50 oranges,and 60 pears,I saved $5 on this order。

正則表示式:\\d(?<!$)\\d+\\b

結果:30 100 50 60

相關推薦

表示式學習筆記()——高階技巧

注意:很多正則表示式的實現並不一定支援這些這些功能,或是實現的方式有變化 一、重複匹配 1、匹配一個或多個字元 要想匹配同一個字元(或字元集合)的多次重複,只要簡單地給這個字元(或字元集

java表示式學習筆記

本人在開發中使用正則表達的場景並不多,偶爾用一下,學習一波,時間久了就又忘記了,放到部落格中,說不定什麼時候就用到了。   一.正則表示式的語法 這個語法表來自:http://www.runoob.com/java/java-regular-expressions.html

python表示式學習筆記

正則表示式 學習資源:https://github.com/EbookFoundation/free-programming-books/blob/master/free-programming-books-zh.md 正則表達例子: |    A|B 

以Grep學表示式 學習筆記

基本格式 grep -n -A2 -B3 --color=auto 'the' ./ 搜尋特定字串 grep -n 'the' //含 grep -vn 'the' //不含 grep -in 'the' //含大小寫 利用中括號 [] 來搜尋集合字元 grep -n

表示式學習筆記(一)

開始和結束  ^   $ '^' 表示開始  例如:'^the'  表示以 the 開頭的詞 '$' 表示結束  例如:'the$' 表示以 the 結尾的詞 'the' 表示 包含 the 的詞

C#Regex表示式學習筆記

//判斷輸入的字串只包含漢字  Regex regex = new Regex("^[/u4e00-/u9fa5]+$"); //判斷輸入的字串是否是一個合法的手機號  Regex regex = new Regex("^13//d{9}$"); /// 匹配3位或4位區號

表示式學習筆記一 :e-mail和tel簡單驗證/php

分別在前端和後端實現對錶單(E-mail和 Telphone)的驗證 廢話不多,程式碼如下... 前端實現利用正則表示式對e-mail和telphone的驗證 regex_form_relizea.html檔案 <!DOCTYPE html> <html

表示式學習筆記(二)——簡單的表示式

一、簡單的正則表示式 注意: 在使用正則表示式的時候,會發現幾乎所有的問題都有不止一種解決方法。 有的比較簡單,有的比較快速,有的相容性很好,有的功能更全,同一個問題往往會有多種解決方

表示式學習筆記

+:匹配一個或多個字元 *:匹配零個或多個字元 ?:匹配零個或一個字元 \b:單詞邊界 ^:匹配字串的開頭 $:匹配一個字串的結束 (m?)^:不僅匹配一個字串開頭,還匹配換行符後面的開始位置 子表示式:匹配例如&nbsp;這樣的一個整體的字元,如果寫成&n

JavaScript 表示式 學習筆記(一)

名詞解釋 正則表示式:Regular Expression,在程式碼中常簡寫為Re

表示式學習使用筆記整理

正則表示式一般來說分為正向正則表示式和逆向正則表示式 正則表示式可以實現字串匹配的功能,它採用一定的策略進行匹配,在有貪婪模式的情況下,正則會優先匹配能匹配的最大值,然後再以步退的模式向前迭代,直到整句正則表示式完全匹配為止,可以看出,在有貪婪模式的正則中,時間

Python筆記——表示式學習小結

轉自:點選開啟連結 這篇文章主要介紹了python 正則表示式學習小結的相關資料,非常不錯具有參考借鑑價值,需要的朋友可以參考下   在Python中實現正則的方式是通過re(regular expression的縮寫)模組來實現的,你可以呼叫re模組的各種方法

表示式學習——網址匹配

http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 已上鍊接學習大全。 練習:請嘗試寫一個驗證Email地址的正則表示式。 【版本一】應該可以驗證出類似的Email: [email protected] [em

表示式[] {} ()學習

正則表示式的() [] {}有不同的意思。 () 是為了提取匹配的字串。表示式中有幾個()就有幾個相應的匹配字串。 (\s*)表示連續空格的字串。 []是定義匹配的字元範圍。比如 [a-zA-Z0-9] 表示相應位置的字元要匹配英文字元和數字。[\s*]表示空格或者*號。 {

C++Primer_Chap17_標準庫特殊設施_List03_表示式_筆記

  正則表示式(regular expression)是一種描述字元序列的方法,是一種及其強大的計算工具。C++正則表示式庫(RE庫)定義在標頭檔案regex中,包含多個元件: 正則表示式庫元件 regex 表示有一個正則

字元??bugku(表示式學習

題目 通過讀程式碼可以看出只要我們構造出符合正則表示式的字串通過GET傳參傳過去就可以看到 key 即 flag 通過這道題看了很多正則表示式的語法規則…… ------------------------------------------------------------

Java表示式學習與記錄

轉載自:http://www.runoob.com/java/java-regular-expressions.html 正則表示式定義了字串的模式,用於搜尋、編輯或處理文字。 1、正則表示式中字元意義: \            將下一字元標

python 表示式學習

  re.match()函式:   函式語法: re.mathch ( pattern , string , flags = 0) 引數說明: pattem 匹配的正則表示式

表示式簡略筆記

說明:之前提到正則表示式就頭大,每次也都是看個開頭就不看了,堅持不下去,這次終於完整地看完一次文件,加上之前多多少少看過的,對正則表示式算是有了整體的瞭解。這次筆記主要結合一培訓班的課件,以Python的re模組為主。 簡略筆記: 1,正則表示式(Regular Expr

表示式學習

正則表示式 就是為了查詢到制定的字串。 學習它沒有那麼難的,最簡單的表達方式就是 {在哪裡} {什麼字元} {匹配多少次} 一、定位符(在哪裡) 字元 描述 ^ 匹