標籤: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