Perl正則表達(dá)式

2018-08-23 14:17 更新
Perl正則表達(dá)式,匹配操作符,替換操作符修飾符,轉(zhuǎn)換操作符,正則表達(dá)式是一個字符串的字符定義視圖的模式或多模式

正則表達(dá)式是一個字符串的字符定義視圖的模式或多模式。在Perl的正則表達(dá)式的語法是什么,你會發(fā)現(xiàn)在其他正則表達(dá)式,如sedgrepawk的支持程序非常相似。

運(yùn)用正則表達(dá)式的基本方法是使用結(jié)合的經(jīng)營模式=?和!?。第一個是一個測試操作符,第二是一個賦值操作符。


  • 匹配正則表達(dá)式 - m//
  • 替代正則表達(dá)式 - s///
  • 直譯(拼寫)正則表達(dá)式 - tr///

在每種情況下斜線作為正則表達(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+)/);

匹配運(yùn)算符修飾符

匹配的操作符支持其自己的一套修飾符。 /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)換相似但不完全相同替換的原則,但不像替換,轉(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/;

轉(zhuǎn)換操作符

以下是有關(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á)式

你不只是有固定的字符串匹配。事實上,你可以在任何可以使用更復(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斷言

\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á)式中的變量

正則表達(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
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號