定义:正则表达式是一种字符串模式,可用来和字符串进行匹配。匹配可能成功,也可能失败。许多UNIX命令,包括grep, sed, awk, ed, vi, emacs都有正则表达式的功能。Perl也有这种功能。Python也具有这种功能。
简单示例
例如:
grep abd readme.file > result.tx t
则Perl中,写成
if(/abc/)
{
 print $_;
}
在Perl中,正则表达式用斜线标记,以代表斜线之间的内容是个正则表达式。当表达式北斜线包围时,Perl会拿$_和它作比较,以判断条件的真假。
while(<>) {
if (/abc/) {
    print $_;
}
}
这个程序片断能读入某文件的所有内容,并进行匹配。
grep “ab*c” readme.file > result
while( <> )
 {
    if (/ab*c/) {
       print $_;
}
   }
以上程序片断表示以a开头,后面跟0个以上的b,最后以c结尾。
替代运算符以s字母开头,跟正则表达式,再跟替代的运算符号。
s/ab*c/def/
变量是$_会跟正则表达式(ab*c)做比较。进行匹配。
类型:一个“正则表达式”就是一种类型pattern。分为单字符类型和多字符类型。
单字符类型:单字符类型是最常见和最常用的类型。如a。单字符类型”.”能跟除换行符号(/n)的任何字符匹配。如
/a./
会和任何长度为二,且开头是a的字符串匹配。除了”a/n”外。
字符类:(character class),写法是左右两个中括号([]),内放字符。即字符串对应此类型的地方,若出现唯一一个符合括号中列出的字符,就算符合。
/[abcde]/
 /[aeiouAEIOU]/
若在中括号中放[或者],则需要在前面加反斜杠。如果想表示一段范围,则可以用破折号(dash-)连接。想表示破折号,则前面也必须加反斜杠。
[0123456789]
[0-9]
[0-9/-]
[a-zA-Z]
也可以用“反例”表示字符类别,只要在原来的写法前加上“^”即可。此种类型的意思是任何不在此类别内的单一字符才算上匹配。
[^0-9]
[^aeiouAEIOU]
[^/^]
预定义的字符类别
字符
类别
反例
反例类别
/d
[0-9]
/D
[^0-9]
/w
[a-zA-Z]
/W
[^a-zA-Z]
/s
[/r/t/n/f]
/S
[^/r/t/n/f]
[/da-fA-F] # 十六进制数字
类型组合:grouping pattern就是将正则表达式组合起来用。
系列:sequence, 如”abc”
重复符号:multiplier,如星号(*)表示出现零次以上;加号(+)则表示出现一次以上;问号(?)则表示出现零次或一次。
/fo+ba?r/
以上的类型都是贪婪型的greedy。
$_ = “fred xxxxxxxxx barney”;
s/x+/boom/
一般重复符号:(general multiplier),写法是一对大括号中放一个或两个数字,如/x{5, 10}/,表示x出现5到10次;/x{5,}/表示出现5次以上;/x{5}/表示刚好5个x;/x{0,5}/意思就是”0到5个”
正则表达式如出现两个重复符号,必须遵循“最左边最贪心” (leftmost is greediest) 的规则。
$_ = “a xxx c xxxxxxxxxx c xxx d”;
/a.*c.*d/;
以这个例子,第一个“.”就会和第二个c之前所有的字符符合。可以在重复符号后面加上问号,让它变得“不贪心”(nongreedy)。
$_=”a xxx c xxxxxx c xxx d”;
/a.*c?.*d/
把字符串和正则表达式再该一下:
$_=”a xxx ce xxxxxxx ci xxx d”;
/a.*ce.*d/
这个例子中.*如果匹配到第二个c,则e没有办法匹配。故Perl会重试,降低了效率。实际上只要加个”?”就能让Perl少做很多事。
把括号当记忆空间:另外一个组合符号,是前后包围任何类型的括号对(parentheses pair)。括号不会改变类型匹配的情形,不过可以把匹配的部分记录下来,以后参考。调用记住部分,写法是在反斜线后面加上数字。
/fred(.)barney/1/;
会和fredxbarneyx匹配,不会和fredxbarneyy匹配。但是/fred.barney./和两个字符串都匹配。
其中/1代表正则表达式中,第一个用括号括起来的部分。依次有/2, /3…
/a(.)b(.)c/2d/1/;
可以在括号中放入一个以上的字符。如/a(.*)b/1c/;
选项符号:还有一种组合符号称为选项符号(alternation),如“a|b|c”。选项可以不只一个字符,如/song|blue/。
定位类型:anchor pattern定位类型有好几种。定位类型/b,表示目标字符串的这个地方必须是文字边界(word boundary)。所谓“文字边界”就是指符合/w或/W的字符,二个中间的位置;或者界于任何符合/w的字符,与字符串开头(或结尾)中间的位置。
/fred/b/ ;       # 会和 fred 匹配,不会和 Frederick 匹配
//bmo/ ;       # 会和 moe 和 mole 匹配,不会和 Elmo 匹配
//bFred/b/ ;    # 会和 Fred 匹配,但 Frederick 或 alFred 都不匹配
//b/+/b/ ;      # 会和 x+y 匹配,不会和 ++ 或 + 匹配
另一个定位类型/B所在之处就不一定是文字边界,如
//bFred/B/ ;    # 会和 Frederich 匹配,但 Fred Flintstone 不匹配
还有两种类型,代表字符串的开头或结尾的前一个字符。“^”会和字符串的“开头”匹配。^a会匹配以a开头的字符串,不过a^会和”a”和”^”这两个字符串匹配。即”^”失去了特别的意义 。如果想表示字符串开头是有个^号,则用/^即可。另外一个定位类型是”$”,不过表示字符串结尾。c$表示最后出现的字符是c的那个字符串。表示$这个字符,用/$表示。
优先级
名称
表示法
括号(parentheses)
() (?:)
重复运算符(multiplier)
? + * {m, n} ?? +? *? {m, n}?
序列和定位符号(sequence and anchoring)
abc^$/A/Z(?=) (?!)
选项符号(alternation)
|
abc*           # 会和 ab, abc, abcc, abccc, abcccc 匹配
 (abc)*
 ^x|y
 ^(x|y)
 a|bc|d
 (a|b)(c|d)
 (song|blue)bird
=~ 运算符:如果拿来匹配的字符串,不放在$_变量,则可以用”=~”运算符来解决:可把正则表达式放在运算符右侧,左侧则是想比较的字符串。即把正则表达式的默认目标转向运算符的左边运算单元。
$a = “hello world!”;
$a =~ /^he/;
$a=~/(.)/1/;
if($a=~/(,)/1/)
任何能传回标量字符串值的语句,都可以当作=~运算符的左边单元。如<STDIN>,如
print “any last request?”;
if(<STDIN> =~ /^[yY]/) {
print “And just what might that request be”;
<STDIN>
print “Sorry, I’m unable to do that./n”
}
忽略大小写:grep有-I这个旗标,意思是忽略大小写;在Perl中提供了类似的方法:在正则表达式第二个斜线之后写上I即可。如/somepattern/i。
print “any last request?”;
if (<STDIN> =~ /^y/i)
{
}
指定界限符号:正则表达式前后用斜线包起来,斜线叫分界符号(delimiter),如果想在正则表达式表示斜线这个“字符”,在前面加反斜线。
$path = <STDIN>
if($path =~ /^//usr//etc/) {
}
Perl允许设计者自行指定分界符合。可用任何-个非字母、非数字、非空白的字符为分界符号,方法是在第一次使用之前写”m”。
/^//usr//etc/
 m@^/user/etc@
 m#^/usr/etc#
内插变量:正则表达式也可以内插变量。
$what = “bird”
$sentence = “Every good bird does fly.”;
if($sentence =~ //b$what/b/)
{
print “The sentence contains the word $what/n”;
}
下面的例子稍微复杂一些:
$sentence = “Every good bird does fly.”;
print “What should I look for?”;
$what = <STDIN>;
chomp($what);
if($sentence =~ /$what/)
{
print “I saw $what in $sentence./n”;
}
else
{
print “nope... didn’t find it./n”;
}
特别的只读变量:匹配成功后,名为$1, $2, $3...的这些变量,它们的值被分别设为/1,/2,/3...之值。
$_ = “this is a test”;
   /(/w+)W+(/w+)/ ; # 和头两个文字匹配;现在 $1 是 ”this” , $2 是 ”is” 。
也可以在列表环境下,一次取得所有匹配的片断。
$_=”this is a test.”;
($first, $second) = /(/w+)W+(/w+)/;
其他预定义的只读变量包括:” $&”,代表字符串中匹配正则表达式的部分;” $`”代表匹配处之前的部分;” $’”代表匹配处之后的部分。
$_=”this is a sample string.”;
/sa.*le/; #和sample匹配。s`是”this is a “,$&是”sample”,$’是”string”
替代运算符:s/old-regex/new-string/这样的用法是最简单的一种替代运算符。如果想让替代运算符在每个匹配的地方取代,而非仅作用在第一个匹配处,在运算符加g.
$_=”foot fool buffoon”;
 s/foo/bar/g;
替代运算符也可以内插变量,像这样:
$_=”hello, world”;
 $new = “goodbye”;
 s/hello/$new/;
可以在替代运算符里用字符类型,就不会和固定的字符匹配了:
$_=”this is a test”;
s/(/w+) /<$1>/g; #$_现在是<this> <is> <a> <test>
替代运算符可以加上i,代表忽略大小写,如果已经有g了,则i可以出现在g前后。斜线还可以用其他符号代替。s#fred#barney#;替代运算符也可以用=~改变作用的目标。
split和join函数:正则表达式可以把字符串分成许多字段。split函数可以这样做。而join函数则可以把这些片断组合起来。split函数有两个参数,分别是正则表达式和字符串,它会寻找字符串中匹配正则表达式的部分,其他不匹配的部分会依序用列表值方式传回。
$line= “merlyn::118:10:Randal:/home/merlyn:/urs/bin/perl “;
@fields = split(/:/, $line);
如果要匹配一个以上的:则用:
@fields = split(/:+, $line);
变量$_是split函数的第二个参数的默认值:
$_=”some string”;
@words =split(/ /);
由于参数字符串内没有连续的空白字符,结果会是空字符串。理想的写法是/ +/, //s+/和”一个以上“的空白字符匹配。这是第一个参数的默认值。
@words = split; 用空白字符分割 $_ 。
$line=”merlyn::118:10:Randa;:/home/merlyn:”);
($name,$password,$uid,$gid,$gcos,$home,$shell)=split(/:/,$line);
join函数跟split函数对应,该函数用第一个参数字符串当作”胶”,把第二个参数里面的值一个个“粘“起来。
$bigstring=join($glue,@list);

正则表达式详解(Perl)相关推荐

  1. java判断颜色合法_判断颜色是否合法的正则表达式(详解)

    判断颜色是否合法的正则表达式(详解) "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$"; 意思是:以#开头,后面是数字和a-f的字符(大写或小写),这个值是 ...

  2. java中的正则表达式详解

    转自:http://gstarwd.iteye.com/category/91108?show_full=true 想必很多人都对正则表达式都头疼.今天,我以我的认识,加上网上一些文章,希望用常人都可 ...

  3. JavaScript正则表达式详解(一)正则表达式入门

    JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...

  4. python面向对象编程的三大特性_Python面向对象总结及类与正则表达式详解

    Python3 面向对象 -------------------------------------------------------------------------------- 一丶面向对象 ...

  5. 菜鸟教程python正则表达式_python 正则表达式详解

    python 正则表达式详解 1. 正则表达式模式 模式描述 ^ 匹配字符串的开头 $ 匹配字符串的末尾. . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字 ...

  6. JS正则表达式详解2

    JS的正则表达式详解 //校验是否全由数字组成 代码 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.exec(s)) retu ...

  7. linux下grep文件内容搜索工具及基本正则表达式详解

    linux下grep文件内容搜索工具及基本正则表达式详解 grep命令: 根据模式(文本字符和基本正则表达式的元字符组合而成之匹配条件)搜索文本, 并将符合模式的文本行显示出来. 格式:grep [选 ...

  8. python中正则表达式_Python中正则表达式详解

    正则表达式是用来简洁表达一组字符串的表达式,本文主要和大家分享Python 中正则表达式知识详解,希望能帮助到大家.操作符说明实例.表示任何单个字符 [ ]字符集,单个字符取值范围[abc]表示a或b ...

  9. php中正则表达式详解,php正则表达式详解

    php正则表达式详解 一.贪婪模式与非贪婪模式 贪婪模式:可以这样认为,就是在整个表达式匹配成功的前提下,尽可能多的匹配,也就是所谓的"贪婪",通俗点讲,就是看到想要的,有多少就捡 ...

  10. IPV4及IPV6正则表达式详解

    IPV4及IPV6正则表达式详解 一. 背景 二.实际应用情况 2.1 IPv4 2.1.1 IPv4说明 2.1.2 IPv4地址解析 2.1.3 IPv4正则表达式 2.2 IPv6 2.2.1 ...

最新文章

  1. leetcode-135 分发糖果
  2. OpenAI首次推出数学定理推理模型GPT-f,23个推导结果被专业数据库收录
  3. Spring boot格式化器
  4. 有用过PHP SPL的吗,不知道这主要用来干嘛
  5. RocketMQ中的死信队列
  6. python中的进程, 线程
  7. visionpro图片读取、写入
  8. centos7-修改主机名
  9. ERP系统之比较——SAP Oracle BAAN JDE SSA
  10. 11月异步新书人气王票选:kafka、TensorFlow、机器学习、Python、Linux、Unix
  11. 数值分析期末考试复习(引论)
  12. 计算机管理系统工具共享文件夹,win7一键共享工具【管理方式】
  13. 图像风格迁移及代码实现
  14. remp在matlab,基于Matlab的最小二乘支持向量机的工具箱及其应用
  15. 邮件服务器搬家,邮件搬家操作方法
  16. Ubuntu18.04双系统安装+GPU+CUDA10+CUDNN7+ANACONDA3+PYTHON+PYCHARM
  17. 【Rocksdb实现分析及优化】事务之Pessimistic ①
  18. R语言使用cor函数计算dataframe中多个数值数据列之间的相关性系数、计算spearman非参数的等级相关性系数
  19. Android桌面老是跳广告,电脑桌面老是弹出广告怎么办?简单3步轻松屏蔽!
  20. Mac忘记登录密码解决方案

热门文章

  1. 通过Fiddler进行抓包并分析
  2. 麻将判断几步入听算法
  3. 最小费用最大流(详解+模板)
  4. LINUX IIO子系统分析之六 iio device的驱动开发流程说明
  5. java短信模板变量参数赋值_JIEQI CMS模板制作必读(JIEQI CMS模板 - 2.赋值变量形式)...
  6. EOS智能合约开发系列(六): eosio.token
  7. MFC radio button 设置默认选中
  8. UDS诊断服务—物理寻址,功能寻址区别
  9. wps横向计算机在哪里,Win7系统如何横向打印WPS文件
  10. Android音视频点/直播模块开发实践总结-zz