Perl正則表達(dá)式,匹配操作符,替換操作符修飾符,轉(zhuǎn)換操作符,正則表達(dá)式是一個字符串的字符定義視圖的模式或多模式
正則表達(dá)式是一個字符串的字符定義視圖的模式或多模式。在Perl的正則表達(dá)式的語法是什么,你會發(fā)現(xiàn)在其他正則表達(dá)式,如sed,grep和awk的支持程序非常相似。
運(yùn)用正則表達(dá)式的基本方法是使用結(jié)合的經(jīng)營模式=?和!?。第一個是一個測試操作符,第二是一個賦值操作符。
在每種情況下斜線作為正則表達(dá)式(regex的),你指定的分隔符。如果你喜歡用任何其他分隔符,那么你可以代替使用斜線的位置。
m//匹配操作符,用來匹配一個正則表達(dá)式字符串或語句。例如,要匹配的字符序列“foo”對標(biāo)量$bar,你可能會使用這樣的語句:
if ($bar =~ /foo/)
m//其實與同樣功能的q//操作符。你可以使用任何自然匹配的字符作為分隔符表達(dá)式的組合,例如,{},m(),和m><都是有效的。
如果分隔符是斜杠,你可以從m//省略 成m,但所有其他的分隔符,你必須使用m前綴。
請注意,整個匹配表達(dá)式表現(xiàn)出來。即=?!或?匹配操作符左邊的表達(dá)式,返回true(在標(biāo)量上下文)如果表達(dá)式匹配。因此,語句:
$true = ($foo =~ m/foo/);
將會設(shè)置$true的值為1 如果$foo匹配正則表達(dá)式, 否則$true為0匹配失敗。
匹配在列表上下文中,返回任何分組表達(dá)式的內(nèi)容。例如,從字符串中提取的小時,分鐘和秒時,我們可以使用:
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
匹配的操作符支持其自己的一套修飾符。 /g的修飾符,使全局匹配,/i修飾符將匹配不區(qū)分大小寫。這里是完整的修飾符列表:
Modifier Description i Makes the match case insensitive m Specifies that if the string has newline or carriage return characters, the ^ and $ operators will now match against a newline boundary, instead of a string boundary o Evaluates the expression only once s Allows use of . to match a newline character x Allows you to use white space in the expression for clarity g Globally finds all matches cg Allows the search to continue even after a global match fails
還有一個簡單的版本匹配操作符 - ?Pattern?操作符。這基本上是等同于m//運(yùn)算符但它僅匹配一次在字符串之間的每個調(diào)用reset。
例如,可以使用此列表內(nèi)的第一個和最后一個元素:
#!/usr/bin/perl @list = qw/food foosball subeo footnote terfoot canic footbrdige/; foreach (@list) { $first = $1 if ?(foo.*)?; $last = $1 if /(foo.*)/; } print "First: $first, Last: $last\n"; # by o2fo.com This will produce following result First: food, Last: footbrdige
替換操作符,s///確實是只是一個擴(kuò)展,使您可以更換一些新的文本匹配的文本匹配運(yùn)算符。此運(yùn)算符基本形式是:
s/PATTERN/REPLACEMENT/;
PATTERN 是我們正在尋找的正則表達(dá)式的文本。REPLACEMENT 是一個規(guī)范,我們要用來替換找到的文字與文本或正則表達(dá)式。
例如,我們可以使用.cat. 替換所有出現(xiàn)的.dog。
$string =~ s/dog/cat/;
另外一個例子:
#/user/bin/perl $string = 'The cat sat on the mat'; $string =~ s/cat/dog/; print "Final Result is $string\n"; This will produce following result The dog sat on the mat
這里是替代操作符的所有修改的列表:
Modifier Description i Makes the match case insensitive m Specifies that if the string has newline or carriage return characters, the ^ and $ operators will now match against a newline boundary, instead of a string boundary o Evaluates the expression only once s Allows use of . to match a newline character x Allows you to use white space in the expression for clarity g Replaces all occurrences of the found expression with the replacement text e Evaluates the replacement as if it were a Perl statement, and uses its return value as the replacement text
轉(zhuǎn)換相似但不完全相同替換的原則,但不像替換,轉(zhuǎn)換(翻譯)不使用正則表達(dá)式搜索替換值。轉(zhuǎn)換操作符是:
tr/SEARCHLIST/REPLACEMENTLIST/cds y/SEARCHLIST/REPLACEMENTLIST/cds
翻譯替換在SEARCHLIST與在REPLACEMENTLIST相應(yīng)出現(xiàn)的字符所有字符。例如,使用“The cat sat on the mat.”字符串我們已經(jīng)在本章中使用:
#/user/bin/perl $string = 'The cat sat on the mat'; $string =~ tr/a/o/; print "$string\n"; This will produce following result The cot sot on the mot.
也可用于標(biāo)準(zhǔn)的Perl范圍,允許你指定字符的范圍,由字母或數(shù)值。要改變字符串的情況下,您可以使用以下語法在位置的uc函數(shù)。
$string =~ tr/a-z/A-Z/;
以下是有關(guān)操作符的運(yùn)算符名單
Modifier Description c Complement SEARCHLIST. d Delete found but unreplaced characters. s Squash duplicate replaced characters.
/ D的修飾符刪除匹配SEARCHLIST的字符,不具備相應(yīng)的條目在REPLACEMENTLIST。例如:
#!/usr/bin/perl $string = 'the cat sat on the mat.'; $string =~ tr/a-z/b/d; print "$string\n"; This will produce following result b b b.
最后的修飾符,/s刪除被替換的字符的重復(fù)序列,因此:
#!/usr/bin/perl $string = 'food'; $string = 'food'; $string =~ tr/a-z/a-z/s; print $string; This will produce following result fod
你不只是有固定的字符串匹配。事實上,你可以在任何可以使用更復(fù)雜的正則表達(dá)式只是匹配。這里有一個快速的小抄:
Character Description . a single character \s a whitespace character (space, tab, newline) \S non-whitespace character # by o2fo.com \d a digit (0-9) \D a non-digit \w a word character (a-z, A-Z, 0-9, _) \W a non-word character [aeiou] matches a single character in the given set [^aeiou] matches a single character outside the given set (foo|bar|baz) matches any of the alternatives specified
量詞可以用來指定有多少以前的東西,你要匹配,其中“thing”是指一個原義字符,上面列出的元字符,或一組括號中的字符或元字符。
Character Description * zero or more of the previous thing + one or more of the previous thing ? zero or one of the previous thing {3} matches exactly 3 of the previous thing {3,6} matches between 3 and 6 of the previous thing {3,} matches 3 or more of the previous thing
^元字符匹配字符串的開頭和 $ metasymbol 匹配字符串的結(jié)尾。
這里有一些簡單的例子
# nothing in the string (start and end are adjacent) /^$/ # a three digits, each followed by a whitespace # character (eg "3 4 5 ") /(\d\s){3}/ # matches a string in which every # odd-numbered letter is a (eg "abacadaf") /(a.)+/ # string starts with one or more digits /^\d+/ # string that ends with one or more digits /\d+$/
讓我們看看另一個例子
#!/usr/bin/perl $string = "Cats go Catatonic\nWhen given Catnip"; ($start) = ($string =~ /\A(.*?) /); @lines = $string =~ /^(.*?) /gm; print "First word: $start\n","Line starts: @lines\n"; This will produce following result First word: Cats Line starts: Cats When
匹配任何單詞邊界,\w類和\W類之間的區(qū)別定義。 因為\w一個字的字符,\W相反,這通常是指一個詞的終止。 \B斷言不是一個單詞邊界匹配任何位置。例如:
/cat/ # Matches 'the cat sat' but not 'cat on the mat' /\Bcat\B/ # Matches 'verification' but not 'the cat on the mat' /cat\B/ # Matches 'catatonic' but not 'polecat' /\Bcat/ # Matches 'polecat' but not 'catatonic'
|字符是一樣的標(biāo)準(zhǔn)或按位或在Perl。它指定一個正則表達(dá)式或組內(nèi)的備用匹配。例如,以匹配表達(dá)式中的“cat”或“dog”,你可能會使用這個:
if ($string =~ /cat|dog/)
您可以將單個表達(dá)式的元素結(jié)合在一起,以支持復(fù)雜的匹配。尋找兩個人的名字,可以實現(xiàn)兩個獨(dú)立的測試,像這樣:
if (($string =~ /Martin Brown/) || ($string =~ /Sharon Brown/)) This could be written as follows if ($string =~ /(Martin|Sharon) Brown/)
從一個角度的正則表達(dá)式看沒有區(qū)別,也許前者是稍微更清晰。
$string =~ /(\S+)\s+(\S+)/; and $string =~ /\S+\s+\S+/;
然而,在分組的好處是,它使我們能夠從一個正則表達(dá)式提取序列。返回一個列表的順序,在他們出現(xiàn)在原來的分組。例如,在下面的片段中,我們已經(jīng)從一個字符串取出小時,分鐘和秒。
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
除了這種直接的方法,也可以在特殊的$x變量,其中x是該組內(nèi)一些正則表達(dá)式匹配組。因此,我們可以重寫前面的例子如下:
$time =~ m/(\d+):(\d+):(\d+)/; my ($hours, $minutes, $seconds) = ($1, $2, $3);
當(dāng)組用于替代表達(dá)式,$ x的語法,可以用來替換文本。因此,我們可以使用此格式化的日期字符串:
#!/usr/bin/perl $date = '03/26/1999'; $date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#; print "$date"; This will produce following result 1999/03/26
\G斷言,讓您可以繼續(xù)搜索從最后一個匹配發(fā)生的點(diǎn)。
例如,在下面的代碼,我們使用的\G,使我們可以搜索到正確的位置,然后提取一些信息,而無需創(chuàng)建一個更復(fù)雜的,單一的正則表達(dá)式:
#!/usr/bin/perl $string = "The time is: 12:31:02 on 4/12/00"; $string =~ /:\s+/g; ($time) = ($string =~ /\G(\d+:\d+:\d+)/); $string =~ /.+\s+/g; ($date) = ($string =~ m{\G(\d+/\d+/\d+)}); print "Time: $time, Date: $date\n"; This will produce following result Time: 12:31:02, Date: 4/12/00
\G斷言,其實只是元符號相當(dāng)于pos函數(shù),所以正則表達(dá)式之間的調(diào)用,您可以繼續(xù)使用pos,甚至修改pos的值(因此\ G)的使用pos作為一個lvalue子程序:
正則表達(dá)式的變量,包括$,包含匹配無論最后的分組匹配; $&, 其中包含整個匹配的字符串; $`, 其中包含匹配字符串前的一切; 和$', 其中包含匹配的字符串后的一切。
下面的代碼演示的結(jié)果:
#!/usr/bin/perl $string = "The food is in the salad bar"; $string =~ m/foo/; print "Before: $`\n"; print "Matched: $&\n"; print "After: $'\n"; # o2fo.com This code prints the following when executed: Before: The Matched: foo After: d is in the salad bar
更多建議: