正则表达式的使用

Posted on Posted in 未分类

定界符

在程序语言中使用与Perl兼容的正则表达式,通常都需要将模式表达式放入定界符之间,如/.

常使用斜线/作为定界符,如/apple/。用户只要把需要匹配的模式内容放入定界符之间即可。作为定界的字符也不仅仅局限于/,除了字母、数字和斜线“以外的任何字符都可以作为定界符,像#|!”等都可以

原子

原子是正则表达式的最基本组成单元,而且在每个模式中最少要包含一个原子。原子是由所有那些未显示指定为元字符的打印和非打印字符组成,具体分为5类。

  1. 普通字符作为原子:如a~z、A~Z、0~9 等
  2. 一些特殊字符和转义后原子符作为原子:所有标点符号,但语句特殊意义的符号需要转义后才可作为原子,如:” \’ \ * \ + \ ? \ . 等
  3. 一些非打印字符作为原子:如\f \n \r \t \v \cxchangyongfeidayinzifu
  4. 使用通用字符类型作为原子:如 \d \D \w \W \s \S常用的通用字符类型
  5. 自定义原子表([]):如 ‘/[apj]sp/’ ‘/[apj]sp/’yuanzifu

字符串边界限制

在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果。^$分别指字符串的开始和结束

例如在字符串Tom and Jerry chased each other in the house until Tom’s uncle come in 中元字符^\A 置于字符串的开始确保模式匹配出现在字符串的首端:/Tom/

元字符$\Z 置于字符串的结束,确保模式匹配出现在字符串的尾端。/in$/

如果不加边界限制元字符,将获得更多的匹配结果。

/Tom$/ 精确匹配 /Tom/ 模糊匹配

单词串边界限制

在使用各种编辑软件的查找功能时,可以通过选择按单词查找获得更准确的结果。正则表达式中也提供类似的 功能。

例如:在字符串This island is a beautiful land

  • 元字符\b对单词边界进行匹配:
    • /\bis\b/ 匹配单词 is,不匹配Thisisland
    • /\bis/匹配isisland 中的 is ,不匹配 This.
  • 元字符\B 对单词边界以外的部分进行匹配:
    • /\Bis\B/将明确的指示不予单词的左、右边界匹配,只匹配单词的内部。所以在这个例子中没有结果。
    • /\Bis/匹配 This 中的 is

重复匹配

正则表达式中有一些用于重复匹配某些原子的元字符: ?*+

  • 元字符 ? 表示0次或1次匹配紧接在其前的原子。例如: /colou?r 匹配 colour 或 color
  • 元字符 * 表示0次、1次或多次匹配紧接在其前的原子。例如:/zo*/ 匹配 z、zoo
  • 元字符 + 表示1次或多次匹配紧接在其前的原子。例如:/go+gle/ 匹配 goglegooglegooogle 等中间含有多个o的字符串。
  • 元字符 {} 准确的指定原子重复的次数, {m}表示其前的原子恰好出现m次。{m, n} 表示其前原子至少出现m次,至多出现n次。 {m, } 表示其前原子出现不少于m次。例如 /zo{1, 3}m/ 只能匹配字符串 zom zoom zooom

任何一个字符

  • 元字符 . 匹配除换行符外任何一个字符。相当于:[^\n] (Unix系统)或[^\r\n](Windows系统)例如:/pr.y/可以匹配的字符串 preypraypr%y等。
  • 可以使用 .* 匹配除了换行符以外的任何字符。例如 /a.*z$/可以匹配以a开头,z结束的任意不包括换行符的字符串。/.+/也可以完成类似的匹配,不同的是至少要匹配一个字符。

原子表

  • 原子表 [] 中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。如果想匹配一个 ae 使用 [ae]。
  • 原子表 [] 或者称为排除原子表,匹配除表内原子外的任意一个字符。例如:/p[ u] 匹配 part 中的 pa 但无法匹配 computer 中的 pu 因为 u 在匹配中被排除。
  • 原子表 [-] 用于连接一组按ASCII顺序排列的原子,简化书写。例如 /x[123456789]/可以写成x[0-9],用来匹配一个由 x 字母与一个数字组成的字符串;/< [A-Za-z][A-Za-z0-9]*/?>/ 可以匹配

模式选择符

  • 元字符 | 又称模式选择符,在正则表达式中匹配两个或更多的选择之一例如 \bapple|pear\b可以匹配 There are many apple and pear中的apple 和pear

模式单元

  • 元字符 () 将其中的正则表达式变为原子(或称模式单元)使用,与数学表达式中的括号类似,() 可以做为一个单元被单独使用。例如 /Hello (World)|(Earth)/ 可以匹配 Hello WorldHello Earth

重新使用单元

  • 系统自动将模式单元 () 中的匹配依次存储起来,在需要时可以用 \1\2\3的形式进行引用。当正则表达式包含有相同的模式单元时,这种方法非常便于对其进行管理。注意使用时需要写成 \\1\\2例如:\d{4}([\W])\d{2}\1\d{2} 可以匹配 2012-03-25 或者 2012/03/25 但不会匹配 2012-03/25
  • 当不需要存储匹配结果时使用非存储模式单元 (?:)例如 /(?:a|b|c)(D|E|F)\\1g/ 将匹配 aEEg 在一些正则表达式中,使用非存储模式单元是有必要的。否则,需要改变其后引用的顺序。上例还可以写成 /(a|b|c)(C|E|F)\\2g/。

模式修正符

moshixiugaifu

发表评论

电子邮件地址不会被公开。 必填项已用*标注