c 基礎語言程式設計 正規表示式應用

2021-06-29 09:48:16 字數 3280 閱讀 9392

引言

在不同語言中雖正規表示式一樣,但應用函式還是有所區別,在c#語言中使用regex。

可以通過以下兩種方式之一使用正規表示式引擎:

string values = ;

string pattern = @"^\d-\d-\d$";

foreach (string

value

in values)

is a valid ssn.", value);

else

console.writeline(": invalid", value);

}

111-22-3333 is a valid ssn.

111-2-3333: invalid

ismatch()這個函式驗證指定的字串是否匹配指定的正規表示式,但是注意:

預設情況下,如果在整個字串中只要有一部分匹配給定的字串則返回true

一般情況下,當呼叫ismatch()函式的時候都希望是完全匹配,所以在寫正則的時候兩邊都要加^與$

正規表示式重點是在總結字元規律,注意元字元的使用還有轉義字元。

提取單個匹配項或第乙個匹配項

regex.match 方法返回乙個 match 物件,該物件包含有關與正規表示式模式匹配的第乙個子字串的資訊。

string msg =

//逐個提取

//字串提取match()和matches()

//提取第乙個匹配的字串,只提取乙個。

match

match

= regex.

match(msg, @"\d+", regexoptions.ecmascript);

console.writeline(match

.value);

console.readline();

只輸出2010,如果想輸出全部數字,用matches。

提取所有匹配項

regex.matches 方法返回乙個 matchcollection 物件,該物件包含有關正規表示式引擎在輸入字串中找到的所有匹配項的資訊。

string msg = "大夫,我咳嗽得很重。」     大夫:「你多大年記?」     患者:「七十五歲。」     大夫:「二十歲咳嗽嗎」患者:「不咳嗽。?";

matchcollection matches = regex.matches(msg, "咳嗽");

foreach (match item in matches)

console.writeline("一共出現了", matches.count);

輸出3,返回的是乙個集合,然後在裡面逐一提取。

在捕獲內容時,還有捕獲組的概念,就是用括號進行表示。先寫乙個能滿足整個字串的正規表示式,然後在正規表示式中用括號將那些你想要提取的內容括起來,這樣就可以提取你想要的組了。

string msg = "june26,1951    "

;match match = regex.match(msg, @"^([a-za-z]+)\s*(\d)\s*,\s*(\d)\s*$");

console.writeline(match.groups[1].value);

console.writeline(match.groups[2].value);

console.writeline(match.groups[3].value);

這樣就能在全部匹配的情況下,分別獲取了june 26 1951

貪婪模式

正規表示式會盡可能多的找到匹配,這就是正規表示式的貪婪模式。

終止貪婪模式: ? 具有終止貪婪模式的功能。當?出現在了另外乙個限定符後的時候,表示終止貪婪模式。終止貪婪模式,表示,盡可能少的去匹配,則只匹配乙個。

string msg =

"1111。11。111。111111。";

//結果是全部字串

match

match

= regex.

match(msg, "(.+)(。)");

//結果是1111。如果沒有。就是1,匹配時他要盡可能匹配。

match

match

= regex.

match(msg, ".+?。");

console.writeline(match

.value);

替換匹配的子字串

regex.replace 方法會將與正規表示式模式匹配的每個子字串替換為指定的字串或正規表示式模式,並返回進行了替換的整個輸入字串。

string msg = "我的生日是05/21/2010耶我的生日是03/11/2000耶我的生日是05/21/2010耶我的生日是05/21/2010耶";

//在替換的方法中,使用提取組。 注意在引用分組的時候是使用 $1、$2、.....

msg = regex.replace(msg, @"(\d)/(\d)/(\d)", "$3-$1-$2");

反向引用

捕獲組捕獲到的內容,不僅可以在正規表示式外部通過程式進行引用,也可以在正規表示式內部進行引用,這種引用方式就是反向引用。反向引用的作用通常是用來查詢或限定重複、查詢或限定指定標識配對出現等等。在正規表示式內部,要引用內部的分組,則使用\1 \2 \3 \4 等來引用分組。

對於普通捕獲組的反向引用,是通過捕獲組的編號來實現的。([ab])\10

這裡的「\10」會被解析成第10個捕獲組的反向引用。

string msg = "你你你好好好好好好媽媽媽媽媽媽媽媽";

msg = regex.replace(msg, @"(.)\1+", "$1");

這個輸出結果是「你好媽」,正規表示式表示含義時,找到乙個字元以他未引用出現多次的進行替換,替換為反向引用的內容。

上述**中使用了提取組的概念。

提取組:先寫乙個能滿足整個字串的正規表示式,然後在正規表示式 中用括號將那些想要的內容進行提取內容括起來。

小括號從左邊開始數,第乙個小括號就是第一組,第二個小括號就是第二組,

隻數左邊的括號。如沒有,直接返回null。

在正規表示式應用中就是匹配、提取、替換,當然還有這幾個應用的組合,要靈活應用。

c語言正規表示式應用

正規表示式是能極大地提高工作效率的工具,使用過linux下各種具備re特性的工具的人一定對此深有感觸。很多語言都支援re,用的最多的當然是指令碼,其中以perl最盛。不過,用c語言來用re不是很多見,但是有時候也很有用,我最近也是看到別人說道這個,所以搜了一些資料加上自己的體會來說一說re在c語言裡...

C 正規表示式的基礎應用

group 把捕獲的內容命名為group,並壓入堆疊 group 從堆疊上彈出最後壓入堆疊的名為group的捕獲內容,如果堆疊本來為空,則本分組的匹配失敗 group yes no 如果堆疊上存在以名為group的捕獲內容的話,繼續匹配yes部分的表示式,否則繼續匹配no部分 零寬負向先行斷言,由於...

風火程式設計 正規表示式應用

import re s 12hjk pattern re.compile r pattern.match s ret1 r.group print ret1 def make time self,ot 把時間轉成標準格式字串 param time 解析出來的時間格式 2019 09 29 上午 中午...