`
duguyidao
  • 浏览: 138446 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

regular expression/regex(s)(1)

阅读更多
    事实上,正则表达式很早就接触了,曾经在快捷半导体实习时,就是用过perl的正则表达式功能.其实perl的强大之处在于其对文本的处理上,而处理文本或者串的功臣当然就是其正则表达式.
    正则表达式是一种容易使用但是书写和分析比较困难的一种技术,特别是能写出精炼,准确又清晰的正则表达式更是难能可贵.通常情况往往将其写的冗长而又缺乏实用性.所以每每想到用正则表达式都头疼,心里面没底,上网搜索一些资料再写也不一定保证就写的正确,就不要说起精炼了.
    正则表达式用的地方很多,(平常对于字符串的处理),特别是搜索引擎公司(百度或者谷歌)在对网页进行抓取得时候更加显其功能强大.而且几乎所有的编程语言都不同程度的提供了正则表达式功能的实现,当然以perl/php脚本语言的实现更为简练.
    下面用一个日期规格的例子作为说明来显示正则表达式的强大.

1.验证日期的正则表达式加入闰年的判断以及思路分析

进入正题之前,我们需要澄清两个概念:

一,什么是合法的日期范围?对于不同的应用场景,这个问题有不同的解释。这里采纳MSDN中的约定:

    DateTime 值类型表示值范围在公元(基督纪元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之间的日期和时间。

二,关于闰年的阐释。人民教育出版社小学数学室的解释浅明易懂(mediawiki等都没说明为什么整百年份必须是400的倍数时才是闰年):

    关于公历闰年是这样规定的:地球绕太阳公转一周叫做一回归年,一回归年长365日5时48分 46秒。因此,公历规定有平年和闰年,平年一年有365日,比回归年短0.2422日,四年共短0.9688日,故每四年增加一日,这一年有366日,就是闰年。但四年增加一日比四个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年,这样公历年的平均长度与回归年就相近似了。由此规定:年份是整百数的必须是400的倍数才是闰年,例如1900年、2100年就不是闰年。

清楚了以上两个概念,我们进入正题。
首先需要验证年份,显然,年份范围为 0001 - 9999,匹配YYYY的正则表达式为:

    [0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}

其中 [0-9] 也可以表示为 \d,但 \d 不如 [0-9] 直观,因此下面我将一直采用 [0-9]
其实上面的表达式更可以准确表示为:
  [0-9]{3}[1-9]|[0-9]{2}[1-9]0|[0-9][1-9]00|[1-9]000

用正则表达式验证日期的难点有二:一是大小月份的天数不同,二是闰年的考虑。
对于第一个难点,我们首先不考虑闰年,假设2月份都是28天,这样,月份和日期可以分成三种情况:

1、月份为 1, 3, 5, 7, 8, 10, 12,天数范围为 01 - 31,匹配MM-DD的正则表达式为:

    (0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])

2、月份为 4, 6, 9, 11,天数范围为 01-30,匹配MM-DD的正则表达式为:

    (0[469]|11)-(0[1-9]|[12][0-9]|30)

3、月份为 2,考虑平年情况,匹配MM-DD的正则表达式为:

    02-(0[1-9]|[1][0-9]|2[0-8])

根据上面的成果,我们可以得到匹配平年日期格式为YYYY-MM-DD的正则表达式:

([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))

接着我们来解决第二个难点:闰年的考虑。根据闰年的定义,我们可以将闰年分为两类:

1、能被4整除但不能被100整除的年份。寻找后两位的变化规律,可以很快得到下面的正则匹配:

    ([0-9]{2})(0[48]|[2468][048]|[13579][26])

2、能被400整除的年份。能被400整除的数肯定能被100整除,因此后两位肯定是00,我们只要保证前两位能被4整除即可,相应的正则表达式为:

    (0[48]|[2468][048]|[3579][26])00

2.最强验证日期的正则表达式,添加了闰年的验证

这个日期正则表达式支持
YYYY-MM-DD
YYYY/MM/DD
YYYY_MM_DD
YYYY.MM.DD的形式

match : 2008-2-29 2008/02/29

not match : 2008-2-30   2007-2-29

闰年的2月份有29天,因此匹配闰年日期格式为YYYY-MM-DD的正则表达式为:

(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29

最后,将平年和闰年的日期验证表达式合并,我们得到最终的验证日期格式为YYYY-MM-DD的正则表达式为:

(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)

DD/MM/YYYY格式的正则验证表达式为:

(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}))|(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))
分享到:
评论
1 楼 ariestiger 2009-12-16  
密密麻麻好大一坨啊,我觉得你应该把那种“|”颜色换一下,或者把括号逐层的也换一换,这样层次更清晰些,虽然盯着这玩意看几分钟能知道表达的是什么,但做为说明,太不明了啦。 

相关推荐

    java Regular Expression / regexp / zhengzebiaodashi

    正则表达式(Regular Expression,简称regex)是Java编程语言中的一个重要工具,用于处理字符串模式匹配和搜索替换。在Java中,正则表达式通过java.util.regex包中的类和接口来实现,例如Pattern和Matcher。本篇文章...

    C/C++ Regex/Regular Expression(C/C++正则表达式库实现)

    在C/C++编程环境中,正则表达式(Regex或Regular Expression)是一种强大的文本处理工具,用于模式匹配、字符串查找、替换等操作。由于C++标准库并没有内置完整的正则表达式支持,直到C++11标准引入了`<regex>`库,...

    Regex Expression(正则表达式)

    Regular expression 具有可以表达出难以描述、複杂、但是却有特殊规则的字串的功能,所以许多...本文就是要介绍如何利用 GNU Regex 程式库,使自己的程式具有 regular expression 的功能。 这里有文件Regex.h,Regex.c

    regular expression library正则表达式库

    GNU Regex 程式库是 GNU 发展,提供操作比对 Regular Expression 文字字串的程式库,也就是使用 GNU Regex 程式库,可以作到以下的功能: 比对一字串是否完全与 Regular Expression 相幅合。 在一字串中寻找与 ...

    正则表达式资料全集 Regular Expression Syntax Reference

    正则表达式(Regular Expression)是一种强大的文本处理工具,它能用来进行字符串匹配、查找、替换等操作。在编程语言中,正则表达式被广泛应用于数据验证、文本解析、日志分析等领域。本资料全集是针对正则表达式...

    The Regex Coach - interactive regular expressions

    It can show a graphical representation of the regular expression's parse tree. It can single-step through the matching process as performed by the regex engine. Everything happens in "real time", i....

    正则教程 regex regular expression

    **正则表达式**(Regular Expression,简称Regex或RegExp)是一种强大的文本处理工具,主要用于模式匹配,即查找文本中符合某种特定规则的字符串。正则表达式不仅仅是一个简单的查找工具,它还能够进行复杂的字符串...

    正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本匹配工具,在编程和文本处理

    正则表达式:正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本匹配工具,在编程和文本处理中非常有用。它可以用于搜索、编辑、或操纵文本。几乎所有现代编程语言都支持正则表达式的使用,...

    regular expression

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据提取、搜索替换等场景。在 Vim 编辑器中,正则表达式功能强大,能够帮助程序员和开发者在大型项目中高效地进行...

    Regular Expression Recipes for Windows Developers.pdf

    根据提供的文件信息,本书《Regular Expression Recipes for Windows Developers: A Problem-Solution Approach》是一本针对Windows开发者关于正则表达式的实用指南。本书作者是Nathan A. Good,并于2005年出版。...

    正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串中字符组合的模式 它广泛应用于文本处理、数

    正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串中字符组合的模式。它广泛应用于文本处理、数据验证、搜索与替换等领域。 正则表达式的基本组成: 普通字符:直接匹配的字符,如 a, b, 1, # 等。...

    regular expression processor

    regular expression processor, 将正则表达式转换成NFA,接着讲NFA转换成DFA,并输出DFA。同时可以生成DOT文件,以提供给graphviz生成图形界面。

    Regular Expression Cookbook

    正则表达式(Regular Expression),简称为regex,是计算机科学中用于处理字符串的强大工具。它通过一种模式匹配的方式来搜索、替换或提取文本,广泛应用于文本编辑器、编程语言、搜索引擎以及各种数据处理任务中。...

    Regular Expression Tutorial(正则表达式)

    ### 正则表达式(Regular Expression):一种强大的文本匹配工具 正则表达式,英文全称Regular Expression,简称RE,是一种在计算机科学中用于处理字符串的强大工具。它由一系列特殊的字符序列组成,用于在文本中查找...

    A Regular Expression Wrapper Using ATL in C++Src.zip

    在"A Regular Expression Wrapper"项目中,开发者可能已经创建了一个包装器类,将`ATL::CRegEx`的功能进行了封装,使其更容易在应用程序中使用。包装器类可能提供了更加直观的方法,隐藏了底层的COM细节,并且可能...

    正则表达式手册,Regular Expression

    正则表达式(Regular Expression,简称regex)是用于匹配字符串模式的一种强大工具,广泛应用于文本处理、数据验证、搜索和替换等场景。在JavaScript和Java等编程语言中,正则表达式扮演着至关重要的角色。 ...

    正则表达式(regular expression)手册

    正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,广泛应用于数据验证、搜索与替换、文本分析等多个领域。在IT行业中,熟练掌握正则表达式能够极大地提升处理字符串问题的效率。...

    一个基于C#实现的Regular Expression正则表达式验证工具程序代码

    正则表达式(Regular Expression,简称Regex)是编程领域中用于模式匹配和字符串处理的强大工具。在C#中,正则表达式通过System.Text.RegularExpressions命名空间中的Regex类提供支持。这个压缩包文件“regular ...

    Python正则表达式(Regular Expression)

    Python正则表达式,也称为Regular Expression,在编程领域中是一种强大的文本处理工具,它能用于查找、替换或者提取符合特定模式的字符串。Python内置了`re`模块来支持正则表达式操作,使得在Python中使用正则表达式...

    Regular Expression code

    正则表达式(Regular Expression,简称Regex)是用于在文本中进行模式匹配和搜索的强大工具。它使用一种特殊的语法来定义字符串模式,这些模式可以用来查找、替换或提取符合特定规则的文本。在这个名为"Regular ...

Global site tag (gtag.js) - Google Analytics