《精通正则表达式》学习笔记——第2章:入门示例扩展

来源:互联网 发布:dnf 深度优化 2017 编辑:程序博客网 时间:2024/06/06 04:09

学习书籍是中文第三版《精通正则表达式》,作者:(美国)佛瑞德 (Friedl.J.E.F) 译者:余晟

2.1Perl语言的基本使用

  • Perl中使用$去定义变量,在Perl中对某个字符串进行正则匹配$text =~m/正则表达式/ 其中的~m指的是匹配右边的表达式。

2.2 一些基本的例子

  • 输入一个数字(可能是负数或者小数):/^[+-]?[0-9]+(\.[0-9]*)?$/

  • perl语言使用$1表示元字符\1,同理$2 $3 ...表示\2 \3 ...等元字符,\1保存第一个括号中的内容,\2保存第二个括号中的内容,以此内推

  • 来看一个示例程序

if($input=~m/^([+-]?[0-9]+)([CF])$/){    #$1保存([+-]?[0-9]+)中的内容,$2保存([CF])中的内容    $num=$1;    $type=$2;}
  • 嵌套括号
if($input=~m/^([+-]?[0-9]+(\.[0-9]*)?) *([CF])$/){    # 这时候的([CF])的内容使用$3表示    # $1表示([+-]?[0-9]+(\.[0-9]*)?)的内容    # $2表示 (\.[0-9]*)的内容}
  • 非捕获型括号

    • (?:…)表示只分组不捕获,如 ^([+-]?[0-9]+(?:\.[0-9]*)?) *([CF])$其中$2将表示的是([CF]),因为处于第二个括号中的?:表示不捕获计数
  • \s匹配所有空白符(如空格,制表符\t,回车符\r,换行符\n等)

  • \S用来表示除\s之外的字符
  • 类似的还有\w匹配[a-z0-9A-Z],\d匹配[0-9],\W\D表示相反情况

  • /i表示匹配的时候不区分大小写

2.3 使用正则表达式修改文本

  • Perl中:$var=~s/John/Jeff/i 可以看出出现两条斜线,第一条斜线后的内容为待匹配内容,第二条斜线后的内容去替换匹配到的内容。i是指匹配内容的时候不区分大小写不影响替换的内容,即John的内容不区分大小写,然后替换成Jeff~s表示使用Perl中的替换操作

  • 修正股票价格:通常是保留小数点后两位的数字,如果第三位不为0也需要保留,去掉其他数字

    • 表达式:/(\.\d\d[1-9]?)\d*/$1/
  • 提取邮件主题Subject:的内容

    if($line=~m/^Subject:(.*)/i){    $content=$1;}
  • 提取邮件来自者From: name@qq.com (Tom)/^From: (\S+) \(([^()]*) \)/ 其中(\S+)提取From:之后第一个空格之前的邮箱内容,\(\)对括号转义,提取(Tom)中的Tom的值,[^()]*指明其中的内容不能再是括号了

  • 使用”环视“添加逗号:基本过程就是从右往左数,每次数3位,如果左边还有数字的话就加一个逗号,如123,456,789

    • ”顺序环视”从左往右匹配
    • “肯定型环视”使用?=,如(?=\d)它表示如果当前位置右边的字符是数字则匹配成功
    • “逆序环视”使用?<= ,从右往左

    • 顺序环视的例子:将Jeffs变为Jeff's,表达式/\bJeff(?=s\b)/Jeff'/g

    • 逆序环视的例子:将Jeffs变为Jeff's,表达式/(?<=\bJeff)(?=s\b)/'/g
  • 添加逗号的实现方法:

    • 使用顺序环视和$/(?=\d)(?=(\d\d\d)+$)/,/g
    • 使用逆序环视: /(?<=\d)(?=(\d\d\d)+(?!\d))/,/g
    • 去掉逆序环视:/(\d)(?=(\d\d\d)+(?!\d))/$1,/g
  • 四种类型的环视

类型 正则表达式 匹配成功的条件 肯定逆序环视 (?<=…) 子表达式能够匹配左边文本 否定逆序环视 (?<!…) 子表达式不能匹配左边文本 肯定顺序环视 (?=…) 子表达式能够匹配右边文本 否定顺序环视 (?!…) 子表达式不能匹配右边文本
  • 单词分界符\b可表示成(?<=\w)(?!\w)|(?<!\w)(?<=\w).意即左边是单词右边不是单词或者左边不是单词右边是单词。

2.4 Text-to-HTML转换

  • 处理特殊字符
$text=~s/&/&amp;/g; $text=~s/&/&alt;/g;$text=~s/&/&gt;/g;
  • 分隔段落
^\s*$
  • 将Email转为超链接
    • 不考虑用户名和主机名$text=~s/\b(username\@hostname)\b/<a href="mailto:$1">$1<\/a>/g
    • 用户名和主机名匹配:/\w[-.\w]*\@\w+(\.\w)*\.(com|edu|info)/,这里的用户名可以包含-,.等字符
    • 实际上使用\w匹配用户名@主机名不合适,有的系统\w能匹配非ASCII字母,所以将\w替换成[0-9a-zA-Z]好点
    • 修饰符/x忽略表达式中的空白字符

      $text=~s/
      \w[-.\w]* #用户名
      \@
      \w+(\.\w)*\.(com|edu|info) #主机名
      /gix
  • 将HTTP Url转为超链接
$text=~s/        \b        (     #这个括号用来捕捉URL                                            http:\/\/                               #所以的/都要转义,防止和元字符冲突        [-0-9a-z]+(\.[0-9a-z]+)*\.(com|edu|info)  \b   #主机名         (          /[-0-9a-z_:&?=+,!%*\@\.\$]*  #路径可以由各种字符组成,但是可以不出现        )?        )        /        <a href="$1">$1<\/a>      #要替换的超链接        /gix
0 0