正则表达

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/01 19:56:39
正则表达

正则表达
正则表达

正则表达
正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式、正规表示式或常规表达式,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在很多文本编辑器或其他工具里,正规表达式通常被用来检索和/或替换那些符合某个模式的文本内容.许多程序设计语言都支持利用正规表达式进行字符串操作.例如,在Perl中就内建了一个功能强大的在正规表达式引擎.正规表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的.
  [编辑]基本概念
  正规表达式也经常被称为模式,用来描述或者匹配一系列符合某个句法规则的字符串.例如,Handel,Händel,和Haendel三个字符串,都可以由"H(a|ä|ae)ndel"这个模式来描述.大部分形式都有如下的结构:
  替换
  |
  竖直分隔符代表替换.例如"gray|grey"可以匹配grey或gray.
  数量限定
  某个字符后的数量限定符用来限定前面这个字符允许出现的个数.最常见的数量限定符包括+,,和*(不加数量限定则代表出现一次且仅出现一次):
  +
  加号代表前面的字符必须至少出现一次.例如,"goo+gle"可以匹配google,gooogle,goooogle等;
  问号代表前面的字符最多只可以出现一次.例如,"colou?r"可以匹配colour或者color;
  *
  星号代表前面的字符可以不出现,也可以出现一次或者多次.例如,"0*42"可以匹配42,042,0042,00042等.
  捕获
  圆括号可以用来定义操作符的范围和优先度.例如,"gr(a|e)y"等价于"gray|grey","(grand)?father"匹配father和grandfather.
  上述这些构造子都可以自由组合,因此,"H(ae?|ä)ndel"和"H(a|ae|ä)ndel"是相同的.
  精确的语法可能因不同的工具或程序而异.
  [编辑]历史
  最初的正规表达式出现于理论计算机科学的自动控制理论和形式语言理论中.在这些领域中有对计算(自动控制)的模型和对形式语言描述与分类的研究.1940年代,Warren McCulloch与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元.稍后,数学家Stephen Kleene利用称之为正则集合的数学符号来描述此模型.Ken Thompson将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep.自此,正规表达式被广泛地使用于各种Unix或者类似Unix的工具,例如Perl.
  Perl正规表达式源自于Henry Spencer写的regex,它已经演化成了pcre(Perl兼容正则表达式Perl Compatible Regular Expressions),一个由Philip Hazel开发的,为很多现代工具所使用的库.
  各计算机语言之间的正规表达式的整合目前开展的很差.未来的Perl6的子项目Apocalypse的设计中已考虑到了这点.
  [编辑]表达式全集
  正则表达式有多种不同的风格.下表是在PCRE中元字符及其在正规表达式上下文中的行为的一个完整列表:
  字符 描述
  \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符.例如,“n”匹配字符“n”.“\n”匹配一个换行符.序列“\\”匹配“\”而“\(”则匹配“(”.
  ^ 匹配输入字符串的开始位置.如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置.
  $ 匹配输入字符串的结束位置.如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置.
  * 匹配前面的子表达式零次或多次.例如,zo*能匹配“z”以及“zoo”.*等价于{0,}.
  + 匹配前面的子表达式一次或多次.例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”.+等价于{1,}.
匹配前面的子表达式零次或一次.例如,“do(es)?”可以匹配“do”或“does”中的“do”.等价于{0,1}.
  {n} n是一个非负整数.匹配确定的n次.例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o.
  {n,} n是一个非负整数.至少匹配n次.例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o.“o{1,}”等价于“o+”.“o{0,}”则等价于“o*”.
  {n,m} m和n均为非负整数,其中n