9,以正則表達處理文字(perl筆記)

tonykorn97發表於2007-06-22
1, 以s///進行替換
如果把m//模式匹配運算子想成文書處理器的查詢功能,那麼“查詢與替換”的功能就是perl的s///替換運算子。
$_ = "He's out bowling with barney tonight.";
s/Barney/Fred/; #用Fred替換Barney
print "$_ ";如果匹配失敗,則什麼事都不會發生,變數也不受影響。
s///會返回有用的布林值。它在替換成功時為“真”,否則為“假”

2,以/g進行全域性替換
一個場景的全域性替換是縮減空白,也就是將任何連續的空白轉換為單一空格
$_ = "Input data may have extra whitespace.";
s/s+/ /g;

3,不同的定界符
對於一般沒有左右之分的字元,用法便跟使用斜線一樣,只用3個定界符即可
s#^
如果有左右之分的成對字元,就必須使用兩對,一對包住模式,一對包住替換自發串,包住字串和模式的定界符號簿需要相同
s{fred}{barney};
s[fred}(barney);
s#barney#;

4,選項修飾符
不僅是/g修飾符,替換執行也可以使用我們在一般模式中看到的/i與/s修飾符。修飾符的順序對結果沒有任何影響。

5,繫結運算子
就像在說明m//時提到的,我們也可以用繫結運算子為s///選擇不同的目標


6,大小寫轉換
U跳脫字元會將其後的所有字元轉換成大寫
$_ = "I saw Barney with Fred.";
s/(fred|barney)/U$1/gi; #$_ 現在是"I saw BARNEY with FRED."
L跳脫字元會將其後的字元轉換成小寫
s/(fred|barney)/L$1/gi; #$_ 現在是"I saw barney with fred."

可以使用E關閉大小寫轉換功能
s/(w+) with (w+)/U$2E with $1/i; #$_ 現在是“I saw FRED with barney."

使用小寫形式(l與u)時,它們只會影響之後的第一個字元
s/(fred|barney)/u$1/ig; #$_ 現在是" I saw FRED with Barney."

使用u與L來表示"全部轉換為小寫,但首字母大寫"
s/(fred|barney)/uL$1/ig; #$_ 現在是“I saw Fred with Barney."

這裡介紹的是替換大小寫的轉換,但他們也適用於任何雙引號內的字串
print "Hello, Lu$nameE, would you like to play a game? ";

7, split運算子
它會根據分割符(separator)拆開一個字串。這對處理製表符,冒號,空白或任意符號分割的資料相當有用
@fields = split /separator/, $string;
例如:
@fields = split /:/, "abc:def:g:h"; #產生("abc","def","g","h")
利用/s+/模式以空白進行分割也是常見的做法,在此模式下,所有的空白會被當成一個空格來處理
my $some_input = "This is a test. ";
my @args = split /s+/, $some_input; #("This","is","a","test.")
split預設會以空白字元拆開$_:
my @fields = split; #等於 split /s+/, $_;

8, join函式
split會將自費串分解為整個片斷(子字串),而join則會把這些片斷聯合成一個字串。它的用法如下所示:
my $result = join $glue, @pieces;
例如:
my $x = join ":" 4,6,8,10,12; # $x 為 "4:6:8:10:12"

9, 列表上下文中的m//
$_ = "Hello there, neighbor!";
my($firse,$second,$third) = /(s+) (s+), (s+)/;
print "$sencond is my $third ";

之前在s///的例子中所看到的/g修飾符,同樣也可以用在m//運算子上,其效果就是讓模式能夠匹配到字串中的許多地方。下面的例子中

具有一對圓括號的模式,會在每次匹配成功是返回一個記憶:
my $text = "Fred droped a 5 ton granite block on Mr. Slate";
my @words = ($text =~ /([a-z]+)/ig);
print "Result:@words ";
# Result: Fred dropped a ton granite block on Mr Slate

如果裡面不僅僅是一對圓括號,那麼每次匹配成功,就可能返回一個以上的字串,假設,我們想把一個字串變成雜湊,就可以這樣做:
my $date = "Barney Rubble Fred Flintstone Wilma Flintstone";
my %last_name = ($sdata =~ /(w+)S+(w+)/g);


10, 非貪心量詞
/fred.+?barney/

11, 跨行的模式匹配
傳統的正規表示式都是用來匹配單行文字。由於perl可以處理任意長度的字串。其模式匹配也可以處理多行穩步,與處理單行穩步並無

差異。
$_ = "I'm much better than Barney is at bowling, Wilma. ";
^與$這兩個錨點原本代表整個字串的頭跟尾。當模式加上/m修飾符後,就可以讓他們也代表換行符號。這樣一來,他們所代表的就不在

是整個字串的頭尾,而是每行的開頭跟結尾。
print "Fonud 'wilma' at start of line " if /^wilma /im;

11,一次更新多個檔案
#!/usr/bin/perl -w

use strict;

chomp(my $sdate = `date`);
$^I = ".bak";

while (<>) {
s/^Author:.*/Author: Randal L. Schwartz/;
s/^Phone:.* //;
s/^Date:.*/Date:$date/;
print;
}

# $^I 先把檔案做一個備份

12,不具記憶功能的圓括號

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245694/,如需轉載,請註明出處,否則將追究法律責任。

相關文章