perl: Regex

來源:互聯網
上載者:User

標籤:perl

Regex:

Regex在perl叫模式,是一個匹配某字串的模板。

perl的Regex和shell/awk/sed/grep的差不多。

 

m/pattern/       運算模式比對:

/pattern/就是m/pattern/的簡寫,

定界符//可以換成別的符號([{<#$%等等,

如果用//開頭的m可以省略,其他符號m不能省略。

定界符應該選擇模式中不會出現的字元。

 

Perl中的Regex的修飾符:

/pattern/i     用i來匹配不用區分大小寫。

/pattern/s     用s來匹配任一字元。

/pattern/x    用x來表示可以在模式中隨意加上空白:

Pattern中的空白都回被忽略,可以用\s來匹配空白。

Perl中的注釋也是空白。

 

if   (m{

    Pattern1   #comment1

    Pattern2   #comment2

}six) {

    …

}

 

Perl的反向引用:

\n 表示對哪個分組的引用,分組數為//中的左括弧的位置。

/(.)\1/    表示匹配連續出現的兩個同樣的字元,\1是對第一組的引用。

/x(...)y1\/   表示x之後的三個字元在y之後再出現一次,也就是x...y...

/x(.)(.)\2\1/   分別對第一組和第二組的引用,\2表示對第二個分組的引用。

/x((.)(.)\3\2)y\1/   用到了三個分組。

 

新版perl可以使用反向引用:

\g{N}   用N表示哪個分組。

 

預設的匹配對象是$_。

“string” =~   /pattern/   #使用=~綁定操作符指定匹配的對象。

$res = <STDIN> =~/pattern/;    #如果匹配到$res=1,否則為空白

 

捕獲變數:

$n 用來表示 /pattern/ 中從左至右第n個括弧中的內容。

$n這些捕獲變數只有在下次匹配成功時才會被重設。

(?:pattern)使用?:表示這個括弧不捕獲,只是分組,$n不計數。

if ($str =~ /pattern/) {

    my $match = $1;    #將捕獲的字串儲存起來以便以後使用。

} else {

    …         #如果匹配失敗,$n儲存的還是上次的值。

}

 

新版perl可以使用命名捕捉:

加標籤的方法   /(?<LABEL>PATTERN) /

捕捉的結果進入特殊雜湊%+

鍵:標籤 , 值:就是捕捉的字串。

LABEL自己命名,訪問的值為$+{LABEL}

新版的反向引用還可以用: \g{LABEL} 等效於 \k<LABEL>

 

自動匹配變數:

$& 用來存放/pattern/裡實際匹配到的部分。

$` 用來存放匹配起始位置之前的字串。

$‘   儲存了字串中從來沒有被匹配到的部分。

 

while (<>) {

    chomp;

    if (/YOUR_PATTERN_GOES_HERE/) {

        print “Matched:|$`<$&>$‘|\n”;

    } else {

        print “No match: |$_|\n”;

    }

}

 

s/pattern1/pattern2/   運算替換操作:

s/pattern1/pattern2/;         #用pattern2替換掉pattern1匹配到的內容。

s///   替換成功返回真,否則返回假。

s操作的的定界符也可以是任一字元。

s#pattern1#pattern2#;

s{pattern1}{pattern2};

s[pattern1]<pattern2>;

 

s替換操作的修飾符:

s/pattern1/pattern2/g;    #g表示全域替換。

s/^\s/+|\s+&//g;    #去掉開頭和結尾的空白。

i    表示不去分大小寫

s    表示匹配任一字元。

m   可以匹配行內的分行符號

 

s操作的預設字串也是$_,還可以綁定操作符:

$filename =~ s#^.*/##s;    #去掉路徑擷取檔案名稱

 

大小寫轉換:

下面操作適用於雙引號內的字串。

s/pattern1/\Upattern2/;    #將pattern2轉換成大寫。

s/pattern1/\Lpattern2/;    #將pattern2轉換成小寫。

s/pattern1/\Upattern2\Epattern3/;    #只將pattern2轉換成大寫。

s/pattern1/\Lpattern2\Epattern3/;    #只將pattern2轉換成小寫。

s/pattern1/\upattern2/;    #將pattern2的第一個字元大寫。

s/pattern1/\lpattern2/;    #將pattern2的第一個字元小寫。

 

貪婪量詞:

儘可能匹配更多

*

+

{n}

{n,}

{n,m}

 

非貪婪量詞:

儘可能匹配更少

*?

+?

??

{n}?

{n,}?

{n,m}?

 

一次更新多個檔案:

$^I    表示備份檔案的副檔名。

 

在命令列進行編輯:

perl   -p  -i.bak   -w   -e  ‘s/pattern1/pattern2/g‘  fred*.dat

將所有fred*.dat檔案中的pattern1全部改成pattern2,備份檔案為*.bak.

 

~~  智能匹配:

use    5.010;

智能匹配優先順序:

%a ~~ %b

%a ~~ @b

%a ~~ /Fred/

%a ~~ ‘Fred’

@a ~~ @b

@a ~~ /Fred/

@a ~~ 123

@a ~~ ‘Fred’

$name ~~ undef

$name ~~ /Fred/

123 ~~ ‘123.0’

‘Fred’ ~~ ‘Fred’

123 ~~ 456

 

自動在hash中匹配鍵:

say “I found a key matching‘Fred’.\n”

    if  %name   ~~   /Fred/;

 

比較兩個數組大小:

say “The array have the sameelements!\n”

    if   @arr1    ~~    @arr2;

 

判斷結果是否在集合中:

say “Ths $result is one ofthe input values @nums!\n”

    if @nums  ~~   $result;

 

split   /PATTERN/[, EXPR,LIMIT]]:

將模式作為分隔字元拆分字串到列表中,返回列表或列表長度,

split會保留開頭的空白,忽略結尾的空白,

split預設用空白分割$_.

[email protected] = split;   # ==   split /\s+/, $_;

 

join    EXPR, LIST:

將字串expr作為分隔字元插入到列表中組成一個新的字串並返回。

 

pos

quotemeta

study

qr// 

perl: Regex

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.