zoukankan      html  css  js  c++  java
  • perl 正则表达式使用技巧

    Perl正则表达式语法

    所谓Perl正则表达式,就是一串特别设计过的字符串,可以按照你的意图用匹配操作寻找你要求的目标。我这里不是Perl手册,也不是教科书,所以我从例子开始,具体的完整说明还请查手册。

    1.1转义符号

    前面说过缺省情况下Perl正则表达式要用/包起来,那么现在要寻找一个字符串里面有没有/怎么办?不是有歧义了么那个表达式。换你设计Perl语言该咋办?玩过C语言的人看到这里一定在嘿嘿笑,因为在C里面简单,要写/必须写成/,要写必须写成。说Perl在语法上是C的表弟是很不错的,Perl规定的转义符号也是.常用的特殊符号有回车 ,跳格 ,斜杠和/,引号’和”,方括号,圆括号,美元号$,上尖号^,星号*,点号.,问号?,加号+。我都是随手写的,建议拿不定主意的话,非51个字母的符号都去查查手册吧。
    举例:查一个字符串里有没有美元号;

    my $szValue='$6580.90';
    $szValue =~ /$/;

    1.2 或操作

    Perl的Perl正则表达式缺省是区别大小写的。什么,前面早该告诉你?真可怜,又一个从Windows世界来的小孩,就和我想当然以为在美国商店应该在复活节大做生意创造GDP一样,可是人家不开门。为了串即匹配”Apple”又匹配”apple”,你可以这样:

    $szProductType =~ /[Aa]pple/;

    在方括号里的字母是”或”的关系,击中其中一个就可以了。在一个Perl正则表达式中可以用任意多个方括号,但是不要嵌套。常常能见到的一种表达式

    [0-9] :
    表示0到9这十个字母,也可以用d来代替。D则表示非数字字符。
    [a-zA-Z]
    表示51个字母。

    顺便在这里把反义也讲了吧,[^0-9]代表非数字的其它字符,[^a]代表非a的其它字符。^在这里是反义的意思,但是请注意^还能做头锚用,后面会讲到。

    1.3 尾缀

    有人摇头不喜欢上面的解决方案,我要求真正匹配一个不区分大小写的”Apple”应该怎么办?请这样

    $szProductType =~ /apple/i;

    放在第二个/符号后面的尾缀i取消了一切大小写检查。

    另外再说两个有用的尾缀吧,第一个是g(全局匹配),如果有字符串

    my $string="Applejuice,appleCider,applejeans,applepie,appleplate,apPLebag,…";

    有尾缀/g可以进行全局搜索,就可以找出所有带apple的词汇;例如:

    while($string=~/(apple.*?),/ig)
    {
      print "$1
    ";#打印匹配的内容
    }

    而用表达式$string=~/apple/i;只会遇到第一个apple就结束。

    注意尾缀是可以叠加使用的。上面Perl正则表达式中的圆括号、点号和问号和$1,下面马上会讲到。

    另一个有用的的尾缀是s。s会强迫点号(.)匹配换行符号( ),这对于多行匹配是必须的。不要小看这个技巧,我花了几个小时才找到的哦。

    1.4 捕获匹配的字符串

    my $szValue ='$1999.99';
    if($szValue =~ /$([0-9]+).([0-9]+)/)
    {
     print "$1dollors $1cents
    ";
    }

    上面表达式里的加号表示匹配一到多个前面的符号,在这里符号是数字。用圆括号括住的内容,将会依次(从左到右)出现在”$1,$1,$3……”里面。另外,顺便说,整个Perl正则表达式匹配的结果是放在$&里面,上面这个表达式演算下来$&的值还是”$1999.99”。

    另外,还有1,1形式的反向引用,使得表达式里面可以用捕获的字符串。举例:表达式”(w)1{4,}”在匹配”aabbbbabcdefgccccc111111111999999999”时,匹配结果是:成功;匹配到的内容是”ccccc”。再次匹配下一个时,将得到999999999(要用while和/g来配合)。

    1.5 任意符号.,和次数符号以及+*

    Perl正则表达式里点号是通配任意字母的,例如:

    $string=~/w.*/i;

    就匹配$string里从第一个w字母开始一直到字符串结束。*表示匹配任意字母0到任意多次。号也常被换成+号,表示匹配1到任意多次。如果即没有也没有+,那么就是匹配1次。如果要自己定义匹配的次数或者次数上下限怎么办?用{}符号:

    $string=~/d{5,15}/;
    上面的式子匹配5到15位数字

    $string=~/d{10}/
    上面式子匹配10位数字。

    附带说两个常用的符号,S和s。前者是”非空白”,后者是”空白”,具体来说包括回车、空格、跳格、响铃。

    1.6 贪婪的+和,止贪剂?*

    Perl正则表达式是贪婪的(确切地说,次数符号+和*是贪婪的),可以帮助你做一些事情。

    my $string ='$190098';
    $string =~ /$(d+)/;

    由于+号的贪婪性,$1会得到值”190098”,而不是遇到第一个数字1就完成匹配。

    但有的时候你会不希望他贪婪,希望见好就收。还是我前面用过的一个例子
    my $string=”Applejuice,appleCider,applejeans,applepie,appleplate,apPLebag,…”;

    如果用$string=~/(apple.*),/i;由于*的贪婪性,它会一直匹配到最后一个逗号才停下来,这不是我们想要的结果。
    解决办法是用止贪符号?紧跟在或者+后面,$string=~/(apple.*?),/i;问号会约束遇到第一个逗号就停下来。

    1.7 头锚^和尾锚$

    有时候你希望从一个字符串的开始或者结尾匹配。

    my $string ='Aquickbrownfoxjumpsoveralazysnake';

    $string =~/^A/; #匹配第一个字母是否为A
    $string =~/snake$/; #匹配最后几个字母是否为snake

    还有一个,匹配的是单词边界,意思是空白或者开头或者结尾。

    转载于http://blog.csdn.net/fangwei1235/article/details/8570618

  • 相关阅读:
    让 awesome , emacs , fcitx 一起工作(为awesome添加环境变量,和开机运行脚本)
    告别windows
    使用 Emacs PO mode 编辑 django PO 文件
    [转] Awesome autostart. [为awesome 设置环境变量]
    让 awesome 支持双屏
    解决长email在表格td中不自动换行的问题 & CSS强制不换行
    使用pdb (ipdb) 调试 python 程序
    ClickOnce 部署概述
    SQL Server 2005 CE基础概要
    运算符优先级 (TransactSQL)
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468199.html
Copyright © 2011-2022 走看看