• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >正则表达式 > [php]正则表达式的五个成功习惯

[php]正则表达式的五个成功习惯

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了[php]正则表达式的五个成功习惯等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
正则表达式难于书写、难于阅读、难于维护,经常错误匹配意料不到的文本或者错过了有效的文本,这些问题都是由正则表达式的表现和能力引起的。每个元字符(metacharacter)的能力和细微差别组合在一起,使得代码不借助于智力技巧就无法解释。 
     许多包含一定特性的工具使阅读和编写正则表达式变得容易了,但是它们又很不符合习惯。对于很多程序员来说,书写正则表达式就是一种魔法艺术。他们坚持自己所知道的特征并持有绝对乐观的态度。如果你愿意采用本文所探讨的五个习惯,你将可以让你设计的正则表达式经受的住反复试验。 
    本文将使用Perl、PHP和Python语言作为代码示例,但是本文的建议几乎适用于任何替换表达式(regex)的执行。 

    一、使用空格和注释 
    对于大部分程序员来说,在一个正则表达式环境里使用空格和缩进排列都不成问题,如果他们没有这么做一定会被同行甚至外行人士看笑话。几乎每个人都知道把代码挤在一行会难于阅读、书写和维护。对于正则表达式又有什么不同呢? 
    大部分替换表达式工具都具有扩展的空格特性,这允许程序员把他们的正则表达式扩展为多行,并在每一行结尾加上注释。为什么只有少部分程序员利用这个特性呢?Perl 6的正则表达式默认就是扩展空格的模式。不要再让语言替你默认扩展空格了,自己主动利用吧。 
    记住扩展空格的窍门之一就是让正则表达式引擎忽略扩展空格。这样如果你需要匹配空格,你就不得不明确说明。 
    在Perl语言里面,在正则表达式的结尾加上x,这样“m/foo|bar/”变为如下形式: 
m/ 
  foo 

  bar 
 /x 
    在PHP语言里面,在正则表达式的结尾加上x,这样“"/foo|bar/"”变为如下形式: 
"/ 
  foo 

  bar 
 /x" 
    在Python语言里面,传递模式修饰参数“re.VERBOSE”得到编译函数如下: 
pattern = r''' 
 foo 

 bar 
''' 
regex = re.compile(pattern, re.VERBOSE) 
    处理更加复杂的正则表达式时,空格和注释就更能体现出其重要性。假设下面的正则表达式用于匹配美国的电话号码: 
\(?\d{3}\)? ?\d{3}[-.]\d{4} 
     这个正则表达式匹配电话号码如“(314)555-4000”的形式,你认为这个正则表达式是否匹配“314-555-4000”或者“555- 4000”呢?答案是两种都不匹配。写上这么一行代码隐蔽了缺点和设计结果本身,电话区号是需要的,但是正则表达式在区号和前缀之间缺少一个分隔符号的说明。 
    把这一行代码分成几行并加上注释将把缺点暴露无疑,修改起来显然更容易一些。 
    在Perl语言里面应该是如下形式: 
/   
    \(?     # 可选圆括号 
      \d{3} # 必须的电话区号 
    \)?     # 可选圆括号 
    [-\s.]? # 分隔符号可以是破折号、空格或者句点 
      \d{3} # 三位数前缀 
    [-.]    # 另一个分隔符号 
      \d{4} # 四位数电话号码 
/x 
    改写过的正则表达式现在在电话区号后有一个可选择的分隔符号,这样它应该是匹配“314-555-4000”的,然而电话区号还是必须的。另一个程序员如果需要把电话区号变为可选项则可以迅速看出它现在不是可选的,一个小小的改动就可以解决这个问题。 

    二、书写测试 
    一共有三个层次的测试,每一层为你的代码加上一层可靠性。首先,你需要认真想想你需要匹配什么代码以及你是否能够处理错误匹配。其次,你需要利用数据实例来测试正则表达式。最后,你需要正式通过一个测试小组的测试。 
     决定匹配什么其实就是在匹配错误结果和错过正确结果之间寻求一个平衡点。如果你的正则表达式过于严格,它将会错过一些正确匹配;如果它过于宽松,它将会产生一个错误匹配。一旦某个正则表达式发放到实际代码当中,你可能不会两者都注意到。考虑一下上面电话号码的例子,它将会匹配“800-555-4000  = -5355”。错误的匹配其实很难发现,所以提前规划做好测试是很重要的。 
    还是使用电话号码的例子,如果你在Web表单里面确认一个电话号码,你可能只要满足于任何格式的十位数字。但是,如果你想从大量文本里面分离电话号码,你可能需要很认证的排除不符合要求的错误匹配。 
    在考虑你想匹配的数据的时候,写下一些案例情况。针对案例情况写下一些代码来测试你的正则表达式。任何复杂的正则表达式都最好写个小程序测试一下,可以采用下面的具体形式。 
    在Perl语言里面: 
#!/usr/bin/perl 

my @tests = ( "314-555-4000", 
              "800-555-4400", 
       "(314)555-4000", 
              "314.555.4000", 
              "555-4000", 
              "aasdklfjklas", 
              "1234-123-12345"           
            ); 

foreach my $test (@tests) { 
    if ( $test =~ m/ 
                   \(?     # 可选圆括号 
                     \d{3} # 必须的电话区号 
                   \)?     # 可选圆括号 
                   [-\s.]? # 分隔符号可以是破折号、空格或者句点 
                     \d{3} # 三位数前缀 
                   [-\s.]  # 另一个分隔符号 
                     \d{4} # 四位数电话号码 
                   /x ) { 
        print "Matched on $test\n"; 
     } 
     else { 
        print "Failed match on $test\n"; 
     } 
} 

    在PHP语言里面: 
<?php 
$tests = array( "314-555-4000", 
           "800-555-4400", 
           "(314)555-4000", 
           "314.555.4000", 
           "555-4000", 
           "aasdklfjklas", 
   &n
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-11js正则表达式中的单行模式与多行模式实例分析
  • 2017-05-11PHP中正则表达式对UNICODE字符码的匹配方法
  • 2017-05-11左右若干数字验证的正则表达式
  • 2017-05-11正则表达式之 贪婪与非贪婪模式详解(概述)
  • 2017-05-11php 手机号码验证正则表达式
  • 2017-05-11日常收集整理正则表达式验证大全
  • 2017-05-11正则表达式.号元字符(除了回车符\r和换行符\n)
  • 2017-05-11深度分析正则(pcre)最大回溯/递归限制
  • 2017-05-11正则表达式高级学习技巧
  • 2017-05-11PBlog2 公用JS代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • JS中的正则表达式及pattern的注意事项
    • 正则表达式性能优化方法(高效正则表达式书写)
    • 常用的正则表达式集锦
    • JS正则中的match与exec使用说明
    • 正则表达式u修饰符(支持UTF-16编码)
    • JScript 8.0 正则表达式语法
    • 谈谈我对正则表达式的认识
    • 正则表达式字面量在ECMAScript5中的变化
    • 通过正则表达式删除空行的方法
    • python实现统计汉字/英文单词数的正则表达式

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有