正则表达式

title: 译名问题.
content: 英语:Regular Expression的英语:Regular一般被译为正则、正规或常规。
title: 历史.
content: 最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。  1940年,沃伦·麦卡洛克与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元。  1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为「正则集合」的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED (文字编辑器),随后是Unix上的编辑器ed,并最终引入grep。自此以后,正则表达式被广泛地应用于各种英语:Unix或类Unix系统的工具中。正则表达式的英语:POSIX规范,分为基本型正则表达式(英语:Basic Regular Expression,英语:BRE)和扩展型正则表达式(英语:Extended Regular Express,英语:ERE)两大流派。在兼容英语:POSIX的英语:UNIX系统上,英语:grep和英语:egrep之类的工具都遵循英语:POSIX规范,一些数据库系统中的正则表达式也符合英语:POSIX规范。英语:grep、英语:vi、英语:sed都属于英语:BRE,是历史最早的正则表达式,因此元字符必须转译之后才具有特殊含义。英语:egrep、英语:awk则属于英语:ERE,元字符不用转译  英语:Perl的正则表达式源自于Henry Spencer于1986年1月19日发布的英语:regex,它已经演化成了英语:PCRE(英语:Perl兼容正则表达式,Perl Compatible Regular Expressions),一个由Philip Hazel开发的,为很多现代工具所使用的库。  各编程语言之间关于正则表达式的整合,目前开发进展得很差。英语:Perl6的子项目英语:Apocalypse的设计中已考虑到了这点。
title: 理论.
content: 正则表达式可以用形式化语言理论的方式来表达。正则表达式由常量和算子组成,它们分别表示字符串的集合和在这些集合上的运算。给定有限字母表Σ定义了下列常量:  定义了下列运算:  上述常量和算子形成了克莱尼代数。  很多课本使用对选择使用符号formula_22、formula_23或formula_24替代竖线。  为了避免括号,假定英语:Kleene星号有最高优先级,接着是串接,接着是并集。如果没有歧义则可以省略括号。例如:codice_1可以写为codice_2而codice_3可以写为codice_4。  例子:  为了使表达式更简洁,正则表达式也定义了codice_8和codice_9;codice_10等于codice_11,表示a出现至少一次;而codice_12等于codice_13,表示a出现1次或不出现。有的定义中增加了补算子formula_28;formula_29表示在formula_30上但不在formula_14中的所有字符串的集合。补算子在理论上并非必要,因为它可以使用其他算子来表达,但它可以使一些表达式变得更加简洁。  这种意义上的正则表达式可以表达正则语言,是可被有限状态自动机精确接受的语言类。但是在简洁性上有重要区别。某类正则语言只能用大小指数增长的自动机来描述,而要求的正则表达式的长度只线性的增长。  正则表达式对应于乔姆斯基层级的类型-3文法。但通常编程语言或其相关库(例如PCRE)中实现的正则表达式的表达能力是乔姆斯基层级中类型-3文法的超集。在另一方面,在正则表达式和不导致这种大小上的爆炸的非确定有限状态自动机(英语:NFA)之间有简单的映射;为此英语:NFA经常被用作正则表达式的替表示式。  这种形式化中存在着冗余,典型的体现是存在不同的正则表达式可以表达同样的语言。有可能对两个给定正则表达式写一个算法来判定它们所描述的语言是否本质上相等,即简约每个表达式到极小确定有限自动机,确定它们是否同构(等价)。这种冗余可以消减到什么程度?我们可以找到仍有完全表达力的正则表达式的有趣的子集吗?这提出了一个令人惊奇的困难问题。Kleene星号和并集明显是需要的,但是我们或许可以限制它们的使用。由于正则表达式如此简单,没有办法在语法上把它重写成某种规范形式。过去公理化的缺乏导致了。最近英语:Dexter Kozen用克莱尼代数公理化了正则表达式。  很多现实世界的“正则表达式”引擎实现了不能用正则表达式代数表达的特征。
title: 基本语法.
content: 一个正则表达式通常被称为一个模式(英语:pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。例如:Handel、Händel和Haendel这三个字符串,都可以由codice_14这个模式来描述。大部分正则表达式的形式都有如下的结构:
title: 数量限定.
content: 某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括codice_9、codice_8和codice_19(不加数量限定则代表出现一次且仅出现一次):
title: 匹配.
content: 上述这些构造子都可以自由组合,因此codice_30和codice_31是相同的,表示{"Handel", "Haendel", "Händel"}。  精确的语法可能因不同的工具或程序而异。
title: PCRE表达式全集.
content: 正则表达式有多种不同的风格。下表是在PCRE中元字符及其在正则表达式上下文中的行为的一个完整列表,适用于英语:Perl或者英语:Python编程语言(英语:grep或者英语:egrep的正则表达式文法是英语:PCRE的子集):
title: 范例.
content: (以下使用PHP语言) <?php $str = 'a1234'; if (preg_match("/^[a-zA-Z0-9]{4,16}$/", $str)) { } else {?>  <?php $str = 'a1234'; if (preg_match("/^[A-Za-z]\d{9}$/", $str)) { } else {?> (以下使用Perl语言) print $str = "a1234" =~ m:^[a-zA-Z0-9]{4,16}$:? "CONFIRM" : "FAILED";  print $str = "a1234" =~ m"^\w[12]\d{8}$"? "CONFIRM" : "INVALID";  (以下使用python3语言)使用正则表示式匹配ip地址: import re s=' 192.137.1.336 192.168.1.137.123 192.168.1.138'print(re.findall(r'(?<![\.\d])(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?![\.\d])',s))

Summary: 正规表达式(英语:Regular Expression,常简写为英语:regex、英语:regexp或英语:RE),又称正规表示式、正规表示法、规则运算式、常规表示法,是电脑科学的一个概念。正规表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正规表达式通常被用来检索、替换那些符合某个模式的文本。

Regular expression: A regular expression (shortened as regex or regexp; also referred to as rational expression) is a sequence of characters that define a "search pattern". Usually such patterns are used by string searching algorithms for "find" or "find and replace" operations on strings, or for input validation. It is a technique developed in theoretical computer science and formal language theory.