正則表達式

網址:http://baike.so.com/doc/4934015-5154299.htmlhtml

目錄:正則表達式

【1】 正則表達式應用——替換指定內容到行尾測試

【2】 正則表達式應用——數字替換ui

【3】 正則表達式應用——刪除每一行行尾的指定字符編碼

【4】 正則表達式應用——替換帶有半角括號的多行spa

【5】 正則表達式應用——刪除空行翻譯

【6】 正則表達式應用——實例應用code

【1】正則表達式應用——替換指定內容到行尾regexp

原始文本以下面兩行htm

abc aaaaa

123 abc 444

但願每次遇到「abc」,則替換「abc」以及其後到行尾的內容爲「abc efg」

即上面的文本最終替換爲:

abc efg

123 abc efg

解決:

① 在替換對話框,查找內容裏輸入「abc.*」,替換內容輸入爲「abc efg」

② 同時勾選「正則表達式」複選框,而後點擊「所有替換」按鈕

其中,符號的含義以下:

「.」 =匹配任意字符

「*」 =匹配0次或更多

注意:其實就是正則表達式替換,這裏只是把一些曾經提出的問題加以整理,單純從正則表達式自己來講,就能夠引伸出成千上萬種特例。

【2】正則表達式應用——數字替換

但願把

asdadas123asdasdas456asdasdasd789asdasd

替換爲:

asdadas[123]asdasdas[456]asdasdasd[789]asdasd

在替換對話框裏面,勾選「正則表達式」複選框;

在查找內容裏面輸入「([0-9])([0-9])([0-9])」,不含引號

「替換爲:」裏面輸入「[\1\2\3]」,不含引號

範圍爲你所操做的範圍,而後選擇替換便可。

實際上這也是正則表達式的使用特例,「[0-9]」表示匹配0~9之間的任何特例,一樣「[a-z]」就表示匹配a~z之間的任何特例

上面重複使用了「[0-9]」,表示連續出現的三個數字

括號用來選擇原型,進行分組,替換時要用

「\1」表明第一個「[0-9]」對應的原型,「\2」表明第二個「[0-9]」對應的原型,依此類推

「[」、「]」爲單純的字符,表示添加「[」或「]」,若是輸入「其它\1\2\3其它」,則替換結果爲:

asdadas其它123其它asdasdas其它456其它asdasdasd其它789其它asdasd

功能加強:

若是將查找內容「[0-9][0-9][0-9]」改成「[0-9]*[0-9]」,對應1 或 123 或 12345 或 ...

你們根據須要定製

相關內容還有不少,能夠本身參考正則表達式的語法仔細研究一下

【3】正則表達式應用——刪除每一行行尾的指定字符

由於這幾個字符在行中也是出現的,因此確定不能用簡單的替換實現

好比

12345 1265345

2345

須要刪除每行末尾的「345」

這個也算正則表達式的用法,其實仔細看正則表達式應該比較簡單,不過既然有這個問題提出,說明對正則表達式還得有個認識過程,解決方法以下

解決:

在替換對話框中,啓用「正則表達式」複選框

在查找內容裏面輸入「345$」

這裏「$」表示從行尾匹配

若是從行首匹配,能夠用「^」來實現,不過 EditPlus 有另外一個功能能夠很簡單的刪除行首的字符串

a. 選擇要操做的行

b. 編輯-格式-刪除行註釋

c. 在彈出對話框裏面輸入要清除的行首字符,肯定

【4】正則表達式應用——替換帶有半角括號的多行

幾百個網頁中都有下面一段代碼:

<script LANGUAGE="JavaScript1.1">

<!--

htmlAdWH('93163607', '728', '90');

//-->

</SCRIPT>

我想把它們都去掉,但是找了不少search & replace的軟件,都是隻能對「一行」進行操做。

EditPlus 打開幾百個網頁文件仍是比較順暢的,因此徹底能夠勝任這個工做。

具體解決方法,在 Editplus 中使用正則表達式,因爲「(」、「)」被用作預設表達式(或者能夠稱做子表達式)的標誌,因此查找

「<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH('93163607', '728', '90'.);\n//-->\n</SCRIPT>\n」

時會提示查找不到,因此也就沒法進行替換了,這時能夠把「(」、「)」使用任意字符標記替代,即半角句號:「.」。替換內容爲

<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH.'93163607', '728', '90'.;\n//-->\n</SCRIPT>\n

在替換對話框啓用「正則表達式」選項,這時就能夠完成替換了

補充:

對( ) 這樣的特殊符號,應該用\( \)來表示,這也是很標準的regexp語法,能夠寫爲

<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH\('93163607', '728', '90'\);\n//-->\n</SCRIPT>\n

【5】正則表達式應用——刪除空行

啓動EditPlus,打開待處理的文本類型文件。

①、選擇「查找」菜單的「替換」命令,彈出文本替換對話框。選中「正則表達式」複選框,代表咱們要在查找、替換中使用正則表達式。而後,選中「替換範圍」中的「當前文件」,代表對當前文件操做。

②、單擊「查找內容」組合框右側的按鈕,出現下拉菜單。

③、下面的操做添加正則表達式,該表達式表明待查找的空行。(技巧提示:空行僅包括空格符製表符、回車符,且必須以這三個符號之一做爲一行的開頭,而且以回車符結尾,查找空行的關鍵是構造表明空行的正則表達式)。

直接在"查找"中輸入正則表達式「^[ \t]*\n」,注意\t前有空格符。

(1)選擇「從行首開始匹配」,「查找內容」組合框中出現字符「^」,表示待查找字符串必須出如今文本中一行的行首。

(2)選擇「字符在範圍中」,那麼在「^」後會增長一對括號「[]」,當前插入點在括號中。括號在正則表達式中表示,文本中的字符匹配括號中任意一個字符即符合查找條件。

(3)按一下空格鍵,添加空格符。空格符是空行的一個組成成分。

(4)選擇「製表符」,添加表明製表符的「\t」。

(5)移動光標,將當前插入點移到「]」以後,而後選擇「匹配 0 次或更多」,該操做會添加星號字符「*」。星號表示,其前面的括號「[]」內的空格符或製表符,在一行中出現0個或多個。

(6)選擇「換行符」,插入「\n」,表示回車符。

④、「替換爲」組合框保持空,表示刪除查找到的內容。單擊「替換」按鈕逐個行刪除空行,或單擊「所有替換」按鈕刪除所有空行(注意:EditPlus有時存在「所有替換」不能一次性徹底刪除空行的問題,多是程序BUG,須要多按幾回按鈕)。

【6】 正則表達式應用——實例應用

1.驗證用戶名和密碼:("^[a-zA-Z]\w{5,15}$")正確格式:"[A-Z][a-z]_[0-9]"組成,而且第一個字必須爲字母6~16位;

2.驗證電話號碼:("^(\d{3.4}-)\d{7,8}$")正確格式:xxx/xxxx-xxxxxxx/xxxxxxxx;

3.驗證身份證號(15位或18位數字):("^\d{15}|\d{18}$");

4.驗證Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");

5.只能輸入由數字和26個英文字母組成的字符串:("^[A-Za-z0-9]+$") ;

6.整數或者小數:^[0-9]+\.{0,1}[0-9]{0,2}$

7.只能輸入數字:"^[0-9]*$"。

8.只能輸入n位的數字:"^\d{n}$"。

9.只能輸入至少n位的數字:"^\d{n,}$"。

10.只能輸入m~n位的數字:。"^\d{m,n}$"

11.只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"。

12.只能輸入有兩位小數的正實數:"^[0-9]+(.[0-9]{2})?$"。

13.只能輸入有1~3位小數的正實數:"^[0-9]+(.[0-9]{1,3})?$"。

14.只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。

15.只能輸入非零的負整數:"^\-[1-9][]0-9"*$。

16.只能輸入長度爲3的字符:"^.{3}$"。

17.只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"。

18.只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。

19.只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。

20.驗證是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。

21.只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"

22.驗證URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。

23.驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式爲:"01"~"09"和"1"~"12"。

24.驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式爲;"01"~"09"和"1"~"31"。

25.獲取日期正則表達式:\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日?

評註:可用來匹配大多數年月日信息。

26.匹配雙字節字符(包括漢字在內):[^\x00-\xff]

評註:能夠用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)

27.匹配空白行的正則表達式:\n\s*\r

評註:能夠用來刪除空白行

28.匹配HTML標記的正則表達式:<(\S*?)[^>]*>.*?</>|<.*? />

評註:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於複雜的嵌套標記依舊無能爲力

29.匹配首尾空白字符的正則表達式:^\s*|\s*$

評註:能夠用來刪除行首行尾的空白字符(包括空格、製表符、換頁符等等),很是有用的表達式

30.匹配網址URL的正則表達式:[a-zA-z]+://[^\s]*

評註:網上流傳的版本功能頗有限,上面這個基本能夠知足需求

31.匹配賬號是否合法(字母開頭,容許5-16字節,容許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

評註:表單驗證時很實用

32.匹配騰訊QQ號:[1-9][0-9]\{4,\}

評註:騰訊QQ號從1000 0 開始

33.匹配中國郵政編碼:[1-9]\d{5}(?!\d)

評註:中國郵政編碼爲6位數字

34.匹配ip地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。

評註:提取ip地址時有用

Function IsRegu(Regu,s)

'正則表達式校驗

If Regu="" Then

Exit Function

End if

Dim Re,Sre

Set Re = New RegExp

Re.Pattern = Regu

Sre = Re.Test(s)

If Sre = True Then

IsRegu = True

Else

IsRegu = False

End If

End Function

tmp=" "

if (IsRegu("\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*",tmp )) =false then

msgbox "E-mail地址不合法 !"

FieldCheck#N=false

end if

不一樣的語言(如PHP和JAVA)、相同語言的不一樣類庫(如來自Sun的Java Regular Expression類庫跟Apache Jakarta的正則表達式類庫)間,用法會有所差異,在使用的時候,要注意這些差異。

操做技巧

(摘自《正則表達式之道》)

正則表達式由一些普通字符和一些元字符(metacharacters)組成。普通字符包括大小寫的字母和數字,而元字符則具備特殊的含義,咱們下面會給予解釋。

在最簡單的狀況下,一個正則表達式看上去就是一個普通的查找串。例如,正則表達式"testing"中沒有包含任何元字符,它能夠匹配"testing"和"123testing"等字符串,可是不能匹配"Testing"。

要想真正的用好正則表達式,正確的理解元字符是最重要的事情。下表列出了全部的元字符和對它們的一個簡短的描述。

元字符 描述
\ 將下一個字符標記爲一個特殊字符、或一個原義字符、或一個向後引用、或一個八進制轉義符。例如,「\n」匹配字符「n」。「\\n」匹配一個換行符。序列「\\」匹配「\」而「\(」則匹配「(」。
^ 匹配輸入字符串的開始位置。若是設置了RegExp對象的Multiline屬性,^也匹配「\n」或「\r」以後的位置。
$ 匹配輸入字符串的結束位置。若是設置了RegExp對象的Multiline屬性,$也匹配「\n」或「\r」以前的位置。
* 匹配前面的子表達式零次或屢次。例如,zo*能匹配「z」以及「zoo」。*等價於{0,}。
+ 匹配前面的子表達式一次或屢次。例如,「zo+」能匹配「zo」以及「zoo」,但不能匹配「z」。+等價於{1,}。
? 匹配前面的子表達式零次或一次。例如,「do(es)?」能夠匹配「does」或「does」中的「do」。?等價於{0,1}。
{n} n是一個非負整數。匹配肯定的n次。例如,「o{2}」不能匹配「Bob」中的「o」,可是能匹配「food」中的兩個o。
{n,} n是一個非負整數。至少匹配n次。例如,「o{2,}」不能匹配「Bob」中的「o」,但能匹配「foooood」中的全部o。「o{1,}」等價於「o+」。「o{0,}」則等價於「o*」。
{n,m} m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,「o{1,3}」將匹配「fooooood」中的前三個o。「o{0,1}」等價於「o?」。請注意在逗號和兩個數之間不能有空格。
? 當該字符緊跟在任何一個其餘限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘量少的匹配所搜索的字符串,而默認的貪婪模式則儘量多的匹配所搜索的字符串。例如,對於字符串「oooo」,「o+?」將匹配單個「o」,而「o+」將匹配全部「o」。
.點 匹配除「\n」以外的任何單個字符。要匹配包括「\n」在內的任何字符,請使用像「(.|\n)」的模式。
(pattern) 匹配pattern並獲取這一匹配。所獲取的匹配能夠從產生的Matches集合獲得,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用「\(」或「\)」。
(?:pattern) 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供之後使用。這在使用或字符「(|)」來組合一個模式的各個部分是頗有用。例如「industr(?:y|ies)」就是一個比「industry|industries」更簡略的表達式。
(?=pattern) 正向確定預查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不須要獲取供之後使用。例如,「Windows(?=95|98|NT|2000)」能匹配「Windows2000」中的「Windows」,但不能匹配「Windows3.1」中的「Windows」。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配以後當即開始下一次匹配的搜索,而不是從包含預查的字符以後開始。
(?!pattern) 正向否認預查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不須要獲取供之後使用。例如「Windows(?!95|98|NT|2000)」能匹配「Windows3.1」中的「Windows」,但不能匹配「Windows2000」中的「Windows」。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配以後當即開始下一次匹配的搜索,而不是從包含預查的字符以後開始。
(?<=pattern) 反向確定預查,與正向確定預查相似,只是方向相反。例如,「(?<=95|98|NT|2000)Windows」能匹配「2000Windows」中的「Windows」,但不能匹配「3.1Windows」中的「Windows」。
(?<!pattern) 反向否認預查,與正向否認預查相似,只是方向相反。例如「(?<!95|98|NT|2000)Windows」能匹配「3.1Windows」中的「Windows」,但不能匹配「2000Windows」中的「Windows」。
x|y 匹配x或y。例如,「z|food」能匹配「z」或「food」。「(z|f)ood」則匹配「zood」或「food」。
[xyz] 字符集合。匹配所包含的任意一個字符。例如,「[abc]」能夠匹配「plain」中的「a」。
[^xyz] 負值字符集合。匹配未包含的任意字符。例如,「[^abc]」能夠匹配「plain」中的「plin」。
[a-z] 字符範圍。匹配指定範圍內的任意字符。例如,「[a-z]」能夠匹配「a」到「z」範圍內的任意小寫字母字符。
[^a-z] 負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,「[^a-z]」能夠匹配任何不在「a」到「z」範圍內的任意字符。
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,「er\b」能夠匹配「never」中的「er」,但不能匹配「verb」中的「er」。
\B 匹配非單詞邊界。「er\B」能匹配「verb」中的「er」,但不能匹配「never」中的「er」。
\cx 匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須爲A-Z或a-z之一。不然,將c視爲一個原義的「c」字符。
\d 匹配一個數字字符。等價於[0-9]。
\D 匹配一個非數字字符。等價於[^0-9]。
\f 匹配一個換頁符。等價於\x0c和\cL。
\n 匹配一個換行符。等價於\x0a和\cJ。
\r 匹配一個回車符。等價於\x0d和\cM。
\s 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。
\S 匹配任何非空白字符。等價於[^ \f\n\r\t\v]。
\t 匹配一個製表符。等價於\x09和\cI。
\v 匹配一個垂直製表符。等價於\x0b和\cK。
\w 匹配包括下劃線的任何單詞字符。等價於「[A-Za-z0-9_]」。
\W 匹配任何非單詞字符。等價於「[^A-Za-z0-9_]」。
\xn 匹配n,其中n爲十六進制轉義值。十六進制轉義值必須爲肯定的兩個數字長。例如,「\x41」匹配「A」。「\x041」則等價於「\x04&1」。正則表達式中可使用ASCII編碼。
\num 匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,「(.)\1」匹配兩個連續的相同字符。
\n 標識一個八進制轉義值或一個向後引用。若是\n以前至少n個獲取的子表達式,則n爲向後引用。不然,若是n爲八進制數字(0-7),則n爲一個八進制轉義值。
\nm 標識一個八進制轉義值或一個向後引用。若是\nm以前至少有nm個得到子表達式,則nm爲向後引用。若是\nm以前至少有n個獲取,則n爲一個後跟文字m的向後引用。若是前面的條件都不知足,若n和m均爲八進制數字(0-7),則\nm將匹配八進制轉義值nm。
\nml 若是n爲八進制數字(0-3),且m和l均爲八進制數字(0-7),則匹配八進制轉義值nml。
\un 匹配n,其中n是一個用四個十六進制數字表示的Unicode字符。例如,\u00A9匹配版權符號(&copy;)。
展開

最簡單的元字符是點,它可以匹配任何單個字符(注意不包括換行符)。假定有個文件test.txt包含如下幾行內容:

he is a rat

he is in a rut

the food is Rotten

I like root beer

咱們可使用grep命令來測試咱們的正則表達式,grep命令使用正則表達式去嘗試匹配指定文件的每一行,並將至少有一處匹配表達式的全部行顯示出來。命令

grep r.t test.txt

在test.txt文件中的每一行中搜索正則表達式r.t,並打印輸出匹配的行。正則表達式r.t匹配一個r接着任何一個字符再接着一個t。因此它將匹配文件中的rat和rut,而不能匹配Rotten中的Rot,由於正則表達式是大小寫敏感的。要想同時匹配大寫和小寫字母,應該使用字符區間元字符(方括號)。正則表達式[Rr]可以同時匹配R和r。因此,要想匹配一個大寫或者小寫的r接着任何一個字符再接着一個t就要使用這個表達式:[Rr].t。

要想匹配行首的字符要使用抑揚字符(^)——有時也被叫作插入符。例如,想找到text.txt中行首"he"打頭的行,你可能會先用簡單表達式he,可是這會匹配第三行的the,因此要使用正則表達式^he,它只匹配在行首出現的h。

有時候指定「除了×××都匹配」會比較容易達到目的,當抑揚字符(^)出如今方括號中時,它表示「排除」,例如要匹配he ,可是排除前面是t or s的情形(也就是the和she),可使用:[^st]he。

可使用方括號來指定多個字符區間。例如正則表達式[A-Za-z]匹配任何字母,包括大寫和小寫的;正則表達式[A-Za-z][A-Za-z]* 匹配一個字母后面接着0或者多個字母(大寫或者小寫)。固然咱們也能夠用元字符+作到一樣的事情,也就是:[A-Za-z]+ ,和[A-Za-z][A-Za-z]*徹底等價。可是要注意元字符+ 並非全部支持正則表達式的程序都支持的。關於這一點能夠參考後面的正則表達式語法支持狀況。

要指定特定數量的匹配,要使用大括號(注意必須使用反斜槓來轉義)。想匹配全部10和100的實例而排除1和 1000,可使用:10\{1,2\},這個正則表達式匹配數字1後面跟着1或者2個0的模式。在這個元字符的使用中一個有用的變化是忽略第二個數字,例如正則表達式0\{3,\} 將匹配至少3個連續的0。

這裏有一些有表明性的、比較簡單的例子。

vi 命令 做用
:%s/ */ /g 把一個或者多個空格替換爲一個空格
:%s/ *$// 去掉行尾的全部空格
:%s/^/ / 在每一行頭上加入一個空格
:%s/^[0-9][0-9]* // 去掉行首的全部數字字符
:%s/b[aeio]g/bug/g 將全部的bag、beg、big和bog改成bug。
:%s/t\([aou]\)g/h\1t/g 將全部tag、tog和tug分別改成hat、hot和hut(注意用group的用法和使用\1引用前面被匹配的字符)

例1

將全部方法foo(a,b,c)的實例改成foo(b,a,c)。這裏a、b和c能夠是任何提供給方法foo()的參數。也就是說咱們要實現這樣的轉換:

以前 以後

foo(10,7,2) foo(7,10,2)

foo(x+13,y-2,10) foo(y-2,x+13,10)

foo( bar(8), x+y+z, 5) foo( x+y+z, bar(8), 5)

下面這條替換命令可以實現這一魔法:

:%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g

如今讓咱們把它打散來加以分析。寫出這個表達式的基本思路是找出foo()和它的括號中的三個參數的位置。第一個參數是用這個表達式來識別的::\([^,]*\),咱們能夠從裏向外來分析它:

[^,] 除了逗號以外的任何字符

[^,]* 0或者多個非逗號字符

\([^,]*\) 將這些非逗號字符標記爲\1,這樣能夠在以後的替換模式表達式中引用它

\([^,]*\), 咱們必須找到0或者多個非逗號字符後面跟着一個逗號,而且非逗號字符那部分要標記出來以備後用。

如今正是指出一個使用正則表達式常見錯誤的最佳時機。爲何咱們要使用[^,]*這樣的一個表達式,而不是更加簡單直接的寫法,例如:.*,來匹配第一個參數呢?設想咱們使用模式.*來匹配字符串"10,7,2",它應該匹配"10,"仍是"10,7,"?爲了解決這個兩義性(ambiguity),正則表達式規定一概按照最長的串來,在上面的例子中就是"10,7,",顯然這樣就找出了兩個參數而不是咱們指望的一個。因此,咱們要使用[^,]*來強制取出第一個逗號以前的部分。

這個表達式咱們已經分析到了:foo(\([^,]*\),這一段能夠簡單的翻譯爲「當你找到foo(就把其後直到第一個逗號以前的部分標記爲\1」。而後咱們使用一樣的辦法標記第二個參數爲\2。對第三個參數的標記方法也是同樣,只是咱們要搜索全部的字符直到右括號。咱們並無必要去搜索第三個參數,由於咱們不須要調整它的位置,可是這樣的模式可以保證咱們只去替換那些有三個參數的foo()方法調用,在foo()是一個重載(overloading)方法時這種明確的模式每每是比較保險的。而後,在替換部分,咱們找到foo()的對應實例,而後利用標記好的部分進行替換,是把第一和第二個參數交換位置。

例2

假設有一個CSV(comma separated value)文件,裏面有一些咱們須要的信息,可是格式卻有問題,目前數據的列順序是:姓名,公司名,州名縮寫,郵政編碼,如今咱們但願將這些數據從新組織,以便在咱們的某個軟件中使用,須要的格式爲:姓名,州名縮寫-郵政編碼,公司名。也就是說,咱們要調整列順序,還要合併兩個列來構成一個新列。另外,咱們的軟件不能接受逗號先後有任何空格(包括空格和製表符)因此咱們還必需要去掉逗號先後的全部空格。

這裏有幾行咱們如今的數據:

Bill Jones, HI-TEK Corporation , CA, 95011

Sharon Lee Smith, Design Works Incorporated, CA, 95012

B. Amos , Hill Street Cafe, CA, 95013

Alexander Weatherworth, The Crafts Store, CA, 95014

...

咱們但願把它變成這個樣子:

Bill Jones,CA 95011,HI-TEK Corporation

Sharon Lee Smith,CA 95012,Design Works Incorporated

B. Amos,CA 95013,Hill Street Cafe

Alexander Weatherworth,CA 95014,The Crafts Store

...

咱們將用兩個正則表達式來解決這個問題。第一個移動列和合並列,第二個用來去掉空格。

下面就是第一個替換命令:

:%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3 \4,\2/

這裏的方法跟例1基本同樣,第一個列(姓名)用這個表達式來匹配:\([^,]*\),即第一個逗號以前的全部字符,而姓名內容被用\1標記下來。公司名和州名縮寫字段用一樣的方法標記爲\2和\3,而最後一個字段用\(.*\)來匹配("匹配全部字符直到行末")。替換部分則引用上面標記的那些內容來進行構造。

下面這個替換命令則用來去除空格:

:%s/[ \t]*,[ \t]*/,/g

咱們仍是分解來看:[ \t]匹配空格/製表符,[ \t]* 匹配0或多個空格/製表符,[ \t]*,匹配0或多個空格/製表符後面再加一個逗號,最後,[ \t]*,[ \t]*匹配0或多個空格/製表符接着一個逗號再接着0或多個空格/製表符。在替換部分,咱們簡單的咱們找到的全部東西替換成一個逗號。這裏咱們使用告終尾的可選的g參數,這表示在每行中對全部匹配的串執行替換(而不是缺省的只替換第一個匹配串)。

例3

假設有一個多字符的片段重複出現,例如:

Billy tried really hard

Sally tried really really hard

Timmy tried really really really hard

Johnny tried really really really really hard

而你想把"really"、"really really",以及任意數量連續出現的"really"字符串換成一個簡單的"very"(simple is good!),那麼如下命令:

:%s/\(really \)\(really \)*/very /

摺疊正則表達式語法支持狀況

命令或環境 . [ ] ^ $ \( \) \{ \} ? + | ( )
vi X X X X X          
Visual C++ X X X X X          
awk X X X X     X X X X
sed X X X X X X        
Tcl X X X X X   X X X X
ex X X X X X X        
grep X X X X X X        
egrep X X X X X   X X X X
fgrep X X X X X          
perl X X X X X   X X X X
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息