加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl: 正则表达式

发布时间:2020-12-15 23:45:48 所属栏目:大数据 来源:网络整理
导读:正则表达式: 正则表达式在perl叫模式,是一个匹配某字符串的模板。 perl的正则表达式和shell/awk/sed/grep的差不多。 ? m/pattern/?????? 运算模式匹配: /pattern/就是m/pattern/的简写, 定界符//可以换成别的符号([{#$%等等, 如果用//开头的m可以省略,

正则表达式:

正则表达式在perl叫模式,是一个匹配某字符串的模板。

perl的正则表达式和shell/awk/sed/grep的差不多。

?

m/pattern/?????? 运算模式匹配:

/pattern/就是m/pattern/的简写,

定界符//可以换成别的符号([{<#$%等等,

如果用//开头的m可以省略,其他符号m不能省略。

定界符应该选择模式中不会出现的字符。

?

Perl中的正则表达式的修饰符:

/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(.)(.)21/?? 分别对第一组和第二组的引用,2表示对第二个分组的引用。

/x((.)(.)32)y1/?? 用到了三个分组。

?

新版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/Upattern2Epattern3/;??? #只将pattern2转换成大写。

s/pattern1/Lpattern2Epattern3/;??? #只将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默认用空白分割$_.

my@arr = split;?? # ==?? split /s+/,$_;

?

join??? EXPR,LIST:

将字符串expr作为分隔符插入到列表中组成一个新的字符串并返回。

?

pos

quotemeta

study

qr//?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读