正则表达式
正则表达式(,常简写为--
或--
),又称规律表达式、正规表示式; 表达式; 表示式;、正规表示法、规则运算式、常规表示法,是计算机科学概念,用简单字串来描述、匹配文中全部符合指定格式的字串,现在很多文本编辑器都支援用正则表达式搜寻、取代符合指定格式的字串。
许多程序设计语言都支援用正则表达式操作字串,如Perl就内建功能强大的正则表达式引擎。正则表达式这概念最初由Unix的工具软件(例如sed和grep)普及开。
译名问题.
描述字串规律的表达式原应顺理成章称为规律表达式(pattern expression/rule expression),但却叫成有欠准确的regular expression,导致现在有多种中译名,如将regular译成规律、规则、正规; 正则; 正规;、正则或常规,将expression译成表达式、表示式; 表达式; 表示式;、表示法或运算式等。
历史.
最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。
1940年,沃伦·麦卡洛克与沃尔特·皮茨将神经系统中的神经元描述成小而简单的自动控制元。
1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为「正则集合」的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器,随后是Unix上的编辑器ed,并最终引入grep。自此以后,正则表达式被广泛地应用于各种--
或类Unix系统的工具中。正则表达式的--
规范,分为基本型正则表达式(--
)和扩展型正则表达式(--
)两大流派。在兼容--
的--
系统上,--
和--
之类的工具都遵循--
规范,一些数据库系统中的正则表达式也符合--
规范。--
、--
都属于--
,是历史最早的正则表达式,因此元字符必须转译之后才具有特殊含义。--
则属于--
,元字符不用转译。
的正则表达式源自于于1986年1月19日发布的--
,它已经演化成了--
兼容正则表达式,),一个由开发的,为很多现代工具所使用的库。
各编程语言之间关于正则表达式的整合,目前开发进展得很差。--
的子项目--
的设计中已考虑到了这点。
理论.
正则表达式可以用形式化语言理论的方式来表达。正则表达式由常量和算子组成,它们分别表示字符串的集合和在这些集合上的运算。给定有限字母表Σ定义了下列常量:
定义了下列运算:
上述常量和算子形成了克莱尼代数。
很多课本使用对选择使用符号formula_22、formula_23或formula_24替代竖线。
为了避免括号,假定--
星号有最高优先级,接着是串接,接着是并集。如果没有歧义则可以省略括号。例如: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文法的超集#重定向
重定向;重新导向;字符;字元;文件; 档案;快捷方式; 捷径;项目;专案;计划;计划;计划;计算机; 电脑; 电脑;。在另一方面,在正则表达式和不导致这种大小上的爆炸的非确定有限状态自动机(--
)之间有简单的映射;为此--
经常被用作正则表达式的替表示式。
这种形式化中存在着冗余,典型的体现是存在不同的正则表达式可以表达同样的语言。有可能对两个给定正则表达式写一个算法来判定它们所描述的语言是否本质上相等,即简约每个表达式到极小确定有限自动机,确定它们是否同构(等价)。这种冗余可以消减到什么程度?我们可以找到仍有完全表达力的正则表达式的有趣的子集吗?这提出了一个令人惊奇的困难问题。Kleene星号和并集明显是需要的,但是我们或许可以限制它们的使用。由于正则表达式如此简单,没有办法在语法上把它重写成某种规范形式。过去公理化的缺乏导致了。最近--
用克莱尼代数公理化了正则表达式。#重定向
重定向;重新导向;字符;字元;文件; 档案;快捷方式; 捷径;项目;专案;计划;计划;计划;计算机; 电脑; 电脑;
很多现实世界的“正则表达式”引擎实现了不能用正则表达式代数表达的特征。#重定向
重定向;重新导向;字符;字元;文件; 档案;快捷方式; 捷径;项目;专案;计划;计划;计划;计算机; 电脑; 电脑;
基本语法.
一个正则表达式通常被称为一个模式(--
),为用来描述或者匹配一系列符合某个句法规则的字符串。例如:Handel、Händel和Haendel这三个字符串,都可以由codice_14这个模式来描述。大部分正则表达式的形式都有如下的结构:
选择.
或--
数量限定.
某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括codice_9、codice_8和codice_19(不加数量限定则代表出现一次且仅出现一次):
匹配.
上述这些构造子都可以自由组合,因此codice_30和codice_31是相同的,表示{"Handel", "Haendel", "Händel"}。
精确的语法可能因不同的工具或程序而异。
PCRE表达式全集.
正则表达式有多种不同的风格。下表是在中元字符及其在正则表达式上下文中的行为的一个完整列表,适用于--
或者--
编程语言(--
或者--
的正则表达式文法是--
的子集):
* 验证字串是否只含数字与英文,字串长度并在4~16个字元之间:
范例.
* 简易的中华民国国民身分证字号验证:
* 验证字串是否只含数字与英文,字串长度并在4~16个字元之间:
print $str = "a1234" =~ m:^[a-zA-Z0-9]{4,16}$: ? "CONFIRM" : "FAILED";
* 简易的中华民国身份证字号验证:
print $str = "a1234" =~ m"^\w[1289]\d{8}$" ? "CONFIRM" : "INVALID";
*使用正则表示式匹配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))
外部链接.
重定向;重新导向;字符;字元;文件; 档案;快捷方式; 捷径;项目;专案;计划;计划;计划;计算机; 电脑; 电脑;
解释该规则匹配的字符串;匹配结果有对应的解释;右侧边栏有正则表达式的详细规范及图中的小抄
维基百科图片快照大小不一,加载大概需要3-30秒!