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

perl学习笔记四——正则匹配

发布时间:2020-12-15 23:48:43 所属栏目:大数据 来源:网络整理
导读:正则表达式讲解 一,正则表达式的三种形式: 匹配: ?m/regrep;/ 替换: ?s/pattern;/replacement;/ 转化: ?tr/pattern;/replacement;/ span style="font-size:14px;"$str = "I love Perl";$str =~ m/Perl/; # 表示如果在 $str 中发现 "Perl" 字符串,则返回 "1"

正则表达式讲解

一,正则表达式的三种形式:

匹配: ?m/<regrep>;/

替换: ?s/<pattern>;/<replacement>;/

转化: ?tr/<pattern>;/<replacement>;/

<span style="font-size:14px;">$str = "I love Perl";
$str =~ m/Perl/; # 表示如果在 $str 中发现 "Perl" 字符串,则返回 "1" 否则返回 "0"。
$str =~ s/Perl/BASH/; # 表示将变量 $str 中的 "Perl" 字符串替换为 "BASH",如果发生此替换则返回 "1",否则返回 "0"。
$str !~ tr/A-Z/a-z/; # 表示将变量 $str 中的所有大写字母转化为小写字母,如果转化发生了则返回 "0",否则返回 "1"。
foreach (@array) { s/a/b/; } # 此处每次循环将从 @array 数组中取出一个元素存放在 $_ 变量中,并对 $_ 进行替换处理。
$string =~ s/(love)/<$1>;/; # 此时 $1 = "love",并且该替换的结果是将 $string 变为 "I <love>; perl"</span>
替换操作 s/<pattern>;/<replacement>;/ 还可以在末尾加上 e 或 g 参数
s/<pattern>;/<replacement>;/g 表示把待处理字符串中所有符合 <pattern>; 的模式全部替换为 <replacement>; 字符串,而不是只替换第一个出现的模式。
s/<pattern>;/<replacement>;/e 表示将把 <replacemnet>; 部分当作一个运算符,这个参数用的不多。


二,正则表达式中的常用模式:

. 匹配除换行符以外的所有字符 
x? 匹配 0 次或一次 x 字符串 
x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次数 
x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次数 
.* 匹配 0 次或一次的任何字符 
.+ 匹配 1 次或多次的任何字符 
{m} 匹配刚好是 m 个 的指定字符串 
{m,n} 匹配在 m个 以上 n个 以下 的指定字符串 
{m,} 匹配 m个 以上 的指定字符串 
[] 匹配符合 [] 内的字符 
[^] 匹配不符合 [] 内的字符 
[0-9] 匹配所有数字字符 
[a-z] 匹配所有小写字母字符 
[^0-9] 匹配所有非数字字符 
[^a-z] 匹配所有非小写字母字符 
^ 匹配字符开头的字符 
$ 匹配字符结尾的字符 
d 匹配一个数字的字符,和 [0-9] 语法一样 
d+ 匹配多个数字字符串,和 [0-9]+ 语法一样 
D 非数字,其他同 d 
D+ 非数字,其他同 d+ 
w 英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样 
w+ 和 [a-zA-Z0-9]+ 语法一样 
W 非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样 
W+ 和 [^a-zA-Z0-9]+ 语法一样 
s 空格,和 [ntrf] 语法一样 
s+ 和 [ntrf]+ 一样 
S 非空格,和 [^ntrf] 语法一样 
S+ 和 [^ntrf]+ 语法一样 
b 匹配以英文字母,数字为边界的字符串 
B 匹配不以英文字母,数值为边界的字符串 
a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串 
abc 匹配含有 abc 的字符串 
(pattern) () 这个符号会记住所找寻到的字符串,是一个很实用的语法。第一个 () 内所找到的字符串变成 $1 这个变量或是 1 变量,第二个 () 内所找到的字符串变成 $2 这个变量或是 2 变量,以此类推下去。  
/pattern/i i 这个参数表示忽略英文大小写,也就是在匹配字符串的时候,不考虑英文的大小写问题。 

三:正则表达式的八大原则:

· 原则1:正则表达式有三种不同形式(匹配(m/ /),替换(s/ / /eg)和转换(tr/ / /))。

· 原则2:正则表达式仅对标量进行匹配( $scalar =~ m/a/; 可以工作; @array =~ m/a/ 将把@array作为标量对待,因此可能不会成功)。

· 原则3:正则表达式匹配一个给定模式的最早的可能匹配。缺省时,仅匹配或替换正则表达式一次( $a = 'string string2'; $a =~ s/string/ /; 导致 $a = 'string 2')。

· 原则4:正则表达式能够处理双引号所能处理的任意和全部字符( $a =~ m/$varb/ 在匹配前把varb扩展为变量;如果 $varb = 'a' $a = 'as',$a =~ s/$varb/ /; 等价于 $a =~ s/a/ /; ,执行结果使 $a = " s" )。

· 原则5:正则表达式在求值过程中产生两种情况:结果状态和反向引用: $a=~ m/pattern/ 表示 $a 中是否有子串 pattern 出现,$a =~ s/(word1)(word2)/$2$1/ 则“调换”这两个单词。

· 原则6:正则表达式的核心能力在于通配符和多重匹配运算符以及它们如何操作。$a =~ m/w+/ 匹配一个或多个单词字符;$a =~ m/d/" 匹配零个或多个数字。

· 原则7:如果欲匹配不止一个字符集合,Perl使用 "|" 来增加灵活性。如果输入 m/(cat|dog)/ 则相当于“匹配字符串 cat 或者 dog。
· 原则8:Perl用 (?..) 语法给正则表达式提供扩展功能。(这一点请同学们课后看相关资料)



1,Q E的含义

Q 取消所有元字符的含义直到遇见 E 为止,说得通俗一点,就是说,Perl 中有些字符在模式匹配中出现时,有特殊的含义,Q 的作用就是让这些原本有特殊含义的字符,一律失效,只把它当作一个普通的字符来处理

如果你想在模式中包含通常被看作特殊意义的字符,须在其前加斜线""。如:/*+/中*即表示字符*,而不是上面提到的一个或多个字符的含义。斜线的表示为//。在PERL5中可用字符对Q和E来转义。

注意:$不属于特殊字符.

$as="test";
if("test" =~ m/Q$asE/)
{
print $as;
}
else
{
print "no matchn";<span style="white-space:pre">	</span>
}


if($as =~ m/$as/)
{
print $as;
}
else
{
print "no match";<span style="white-space:pre">	</span>
}
测试结果:

testtest


2,m//,$,$@,$`,$'的含义

正则表达式的变量包括$,其中包含任何的最后匹配的分组匹配;$&,其中包含整个匹配的字符串,$`,它包含了之前匹配的字符串和$',它包含了匹配的字符串后

$string = "The food is in the salad bar";
$string =~ m/foo/;
print "Before: $`n";
print "Matched: $&n";
print "After: $'n";

运行结果如下:

Before: The
Matched: foo
After: d is in the salad bar


3,perl的输入输出:

<span style="font-size:14px;">#!/usr/bin/perl
print"请输入一个字符串!n";
$string = <STDIN>;; # <STIDN>;代表标准输入,会让使用者输入一字符串
chop($string); # 将$string最后一个换行的字符n删除掉
if($string =~ /perl/){
  print("输入的字符串中有 perl 这个字符串!n";
}</span>

(编辑:李大同)

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

    推荐文章
      热点阅读