1. 程式人生 > >正則表示式之分組捕獲、條件表示式、平衡組

正則表示式之分組捕獲、條件表示式、平衡組

其實我是想說平衡組,但我並是想寫一篇給零基礎的朋友們閱讀,我希望你是對正則有所瞭解,對平衡組不太瞭解的朋友閱讀。如果已經瞭解,看看也無妨。多一點思路。

分組捕獲 - ()

就是用括號把要匹配的內容擴起來

命名分組捕獲 - (?<name>)或(?'name')

就是在分組捕獲的基礎上,增加?<分組名>或?'分組名'

為了鞏固印象,舉個例子

axaxbxxxbxxx

分組捕獲:

(a)x

一次匹配結果,將會得到ax,其中分組1捕獲結果為a

命名分組捕獲:

同樣的文字,使用(?<data>a)x

一次匹配結果,你可以用分組序號1,或是分組名data獲得分組匹配結果a

條件表示式 - (?<data>...)(?(data)yes|no)
非常高興,我們開始切入正題了。條件表示式讓我們的正則具有了一定的邏輯判斷能力。比如:

文字:

文字[12]和【56】abcd

要求:

找到[]或【】中間的數字

我們自然要考慮[】或是【]這兩種錯誤的配對關係,這正好使用條件表示式

(?<=(?<o1>/[)|(?<o2>/【))/d+(?=(?(o1)/]|/】))

別看暈了,容我慢慢給你講明這個表示式的書寫思路。

首先,我們要的是中間的數字,如果有其他的怎麼辦?當然是整個丟掉,我們不打算跑題的節外生枝把[文字]也捕獲進來,或是具有容錯的[ 12]捕獲進來,我們在討論問題,就題目而論就可以了。

我首先想到的應該使用(?<=exp)/d+(?=exp2)的寫法,這樣最終結果就只有數字了。

那麼,exp如何寫呢?

很簡單,(?<=[/[/【]),這樣的話,我們無法做到前後的括號型別配對,好吧,我們把[和【分別捕獲,並記錄對應的分組,這樣方便後面可以引用。

前面部分就變成:

(?<=(?<o1>/[)|(?<o2>【))

就單這一部分,我們就捕獲到了一個位置,前面是[或是【的位置,而如果前面是[,則分組o1捕獲到,反之o2捕獲到,到目前為止,都關係不大。但為了能得到對應的匹配,我們配合條件表示式,就方便很多了。

exp2

我們可以寫為

(?=(?(o1)/]|/】))

什麼意思呢?

(?(o1)/]|/】)

表示這裡檢查o1分組捕獲情況,如果捕獲成功,則執行/]的匹配,反之,執行/】的匹配。這樣,我們用條件表示式,就可以確定[]和【】的對應關係了。

平衡組(?<group>)(?<-group>)(?(group)?!)

這個名詞已經用了很久了,無從考證出處,《c#字串和正則表示式》書中沒有提到,無所謂出處了,但這個名字,倒是讓一個簡單的概念變得複雜了,可能我也愚笨,弄了好久才明白,其實很簡單的東西。

說白了,就是命名分組的一個高階用法,命名分組,我們寫(?<group>)可以把捕獲到的內容壓入堆疊,而另一個高階的用法,是(?<-group>)可以把已經壓入堆疊的元素彈出堆疊,(?(group)?!)則是我們剛才看到的條件表示式,如果捕獲到了group分組,則執行?!表示式,?!就是表示式為假,匹配失敗。

舉個不用標準寫法的例子,可能更容易理解一點。

例如文字:

xxxxaxxaxxaxxbxxbxxbxxxx

我們可以用程式碼方式做a...b的驗證

  1. string test = "xxxxaxxaxxaxxbxxbxxbxxxx";  
  2. Match m = Regex.Match(test, "a((?<o>a)|(?<-o>b)|[^ab]+)+b");  
  3. if (m.Groups["o"].Captures.Count > 0)  
  4. {  
  5.     Console.WriteLine("錯誤,不是完整的a...b對應關係,有單獨的a存在");  
  6. }  
  7. else
  8. {  
  9.     Console.WriteLine("很好,a...b對應。");  
  10. }  

可以不使用條件表示式,在程式碼中判斷也可以。

做這個例子的意義是什麼呢?意思就是說明所謂的“平衡組”的工作原理,是檢查是否還有沒有彈出棧的分組,如果有,則表明不是配對存在的,反之是配對出現的。這就是常用的平衡組意義。

相關推薦

表示式分組捕獲條件表示式平衡

其實我是想說平衡組,但我並是想寫一篇給零基礎的朋友們閱讀,我希望你是對正則有所瞭解,對平衡組不太瞭解的朋友閱讀。如果已經瞭解,看看也無妨。多一點思路。 分組捕獲 - () 就是用括號把要匹配的內容擴起來 命名分組捕獲 - (?<name>)或(?'

表示式分組(捕獲)後向引用

       分組          正則表示式中的分組又稱為子表示式,就是把一個正則表示式的全部或部分當做一個整體進行   處理,分成一個或多個組。其中分組是使用“()”表示的。進行分組之後“()”裡面的內容就會被當   成一個整體來處理。          先看看一個

Java表示式分組和替換

正則表示式的子表示式(分組)不是很好懂,但卻是很強大的文字處理工具。 1 正則表示式熱身 匹配電話號碼 // 電話號碼匹配 // 手機號段只有 13xxx 15xxx 18xxxx 17xxx System.out.println("18304

Python中匹配使用findall,捕獲分組(xxx)和非捕獲分組(?:xxx)的差異

bbb tps img 是把 區別 內容 是我 解答 什麽是 轉自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串時遇到的一個坑,分享出來供大家跳坑。 例題: 如圖

表達選擇分組向後引用及捕獲和非捕獲分組(五)(1000

前言 直接用例子作為演示。 四沒有,因為我看了一下,第四節當時理解錯了,還在改。 正文 選擇操作 部分割槽分大小寫 我們在做匹配的時候希望,不區分大小寫。 當然我們在python使用庫中,可以選擇顯示不區分大小寫。 但是python庫在我們寫入中,有個有一個需求一部分是不區分大小寫的。 比如說我們希望the

最全的常用表達式大全——包括校驗數字字符一些特殊的需求等等

反斜杠 -1 正則表達 所有 2個 嵌套 pan span 至少 轉載:http://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html 一、校驗數字的表達式 1 數字:^[0-9]*$ 2 n位的數字:^\d{n

(轉)最全的常用表達式大全——包括校驗數字字符一些特殊的需求等

需求 至少 xxxxx 0.00 下劃線 最全的 電話 使用 字符串 一、校驗數字的表達式 1 數字:^[0-9]*$ 2 n位的數字:^\d{n}$ 3 至少n位的數字:^\d{n,}$ 4 m-n位的數字:^\d{m,n}$ 5 零和非零開頭的數字:^(0|[1-

匹配replace方法

lac 一次 var 字符 div 之前 認知 color return 在我印象中,replace方法就是一個正則匹配,然後一股腦的替換掉匹配到的內容的一個方法。 在一次任務需求中,有這麽一個需求,一行字符串裏面,替換相應字符串,具體就是匹配到‘A’然後把‘A’替換成‘a

Linux 學習總結(十九)三劍客grep

grepgrep 過濾器,egrep可以理解為grep的升級版1 格式:grep [-cinvABC] ‘word‘ filename-c:統計符合要求的行數例如 : grep -c ‘root‘ /etc/passwdgrep -c ‘‘ /etc/passwd 統計文件總行數-i:忽略大小寫-n:行號輸出

Linux學習總結(二十)三劍客sed

sedsed 流式編輯器,針對文檔的行來操作的 一 查找打印 1.打印某行格式: sed -n ‘n‘p filename 單引號內的n代表數字,表示第幾行例如:打印第二行sed -n ‘2‘p /etc/passwd也可以指定區間,比如打印前三行sed -n‘1,3‘p /etc/passwd打印所有的行s

Linux學習總結(二十一)三劍客awk

awkawk 也是流式編輯器,它比sed的功能更強大 1.截取文檔中的某段 awk -F ‘:‘ ‘{print $1}‘ /etc/passwd |head -2-F 指定分割符,不指定以空格或者tab為分隔符print 為打印動作$1 為第一字段, $2 為第二字段,依次類推,$0標示整行那麽打印整個文檔

C語言入門(廿二)預處理指令巨集條件編譯檔案包含typedefconst

預處理指令 什麼是預處理指令: 在我們的檔案翻譯成0和1之前做的操作我們稱之為預處理指令。一般情況預處理指令都是以#號開頭的。 巨集定義的格式 不帶引數的巨集定義: #define 巨集名 值 巨集定義的作用:      

關係表示式條件表示式邏輯表示式

一、算述表示式 優先順序高 左結合 賦值表示式 優先順序低 右結合 二、關係表示式(比較) 1、關係表示式(左結合): 優先順序次於算述表示式 (1)<、>、<=、>=優先順序高 (2)==(等於)、!=(不等於)優先順序低 2、成立不成立

判斷字串是否為數值(正數負數小數)

在用MapReduce進行處理業務時,發現HDFS中的資料有的列為漢字、有的列為字串、有的列為正數、有的為負數、有的為小數,根據業務要求只有數字參與運算,因此首先清洗資料,用正則提取所有數值: public boolean isNumber(String str){    &

匹配零寬斷言

當我們需要匹配一些字元,這些字元之前或者之後必須是特定內容的情況時,最明智的一種解決方案應該是零寬斷言了。 定義 用於給指定位置新增限定條件(斷言),在這個位置之前或者之後滿足這個限定條件時,該斷言成功。 當斷言失敗時不會再繼續匹配,當斷言匹配成功後正則表示式中的其他匹配才會繼續。 斷言部分也可以是一

常用表達式大全——包括校驗數字字符特殊密碼過濾

2個 ron 帳號 sci 都在 大寫 計算 去掉 style 原文鏈接http://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html 常用正則的,可以在下面找到最適用的正則,前端常用的,收藏,不用每次都去找; 介紹:

機器學習 - 化方法:L1和L2 regularization資料集擴增dropout

正則化方法:防止過擬合,提高泛化能力   常用的正則化方法有:L1正則化;L2正則化;資料集擴增;Droupout方法   (1) L1正則化 (2) L2正則化 (3) Droupout 【參考】https://blog.cs

jquery表達式驗證【是否帶有小數是否中文名稱組成是否全由8位數字組成電話碼格式郵件地址】

width fun form NPU div 電話號碼 作用 reg doc 1 <form name="myform" action="" onsubmit="return fun1()"> 2 <div align="center"> 3

化方法:L1和L2 regularization資料集擴增dropout

正則化方法:防止過擬合,提高泛化能力 在訓練資料不夠多時,或者overtraining時,經常會導致overfitting(過擬合)。其直觀的表現例如以下圖所看到的。隨著訓練過程的進行,模型複雜度新增,在training data上的error漸漸減小。可是在驗證集上的error卻反而漸漸增

OC實現猜拳遊戲2.0(更簡單方法,用兩個物件繼承條件表示式@proterty增強和點語法)

/*概述:玩家和電腦出拳,贏方加分,輸的一方不加分。每一局之後詢問玩家是否繼續。 分析:物件1:玩家,同電腦。方法:被詢問時選擇出拳並輸出選擇(列舉) 物件2:電腦,屬性:姓名,出的拳頭,分數。方法:出拳,判斷輸贏(傳玩家物件)並計分。