正则表达式 – 语法( 三 )


其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串 。
反向引用对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储 。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式 。每个缓冲区都可以使用 'n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数 。
可以使用非捕获元字符 '?:'、'?=' 或 '?!' 来重写捕获,忽略对相关匹配的保存 。
反向引用的最简单的、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力 。以下面的句子为例:
Is is the cost of of gasoline going up up?上面的句子很显然有多个重复的单词 。如果能设计一种方法定位该句子,而不必查找每个单词的重复出现,那该有多好 。下面的正则表达式使用单个子表达式来实现这一点:
/b([a-z]+) 1b/gi捕获的表达式,正如 [a-z]+ 指定的,包括一个或多个字母 。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配 。1 指定第一个子匹配项 。字边界元字符确保只检测整个单词 。否则,诸如"is issued"或"this is"之类的词组将不能正确地被此表达式识别 。
正则表达式后面的全局标记 (g) 指示,将该表达式应用到输入字符串中能够查找到的尽可能多的匹配 。表达式的结尾处的不区分大小写 (i) 标记指定不区分大小写 。多行标记指定换行符的两边可能出现潜在的匹配 。
反向引用还可以将通用资源指示符 (URI) 分解为其组件 。假定您想将下面的 URI 分解为协议(ftp、http 等等)、域地址和页/路径:
http://www.w3cschool.cn:80/html/html-tutorial.html下面的正则表达式提供该功能:
/(w+)://([^/:]+)(:d*)?([^# ]*)/第一个括号子表达式捕获 Web 地址的协议部分 。该子表达式匹配在冒号和两个正斜杠前面的任何单词 。第二个括号子表达式捕获地址的域地址部分 。子表达式匹配 / 或 : 之外的一个或多个字符 。第三个括号子表达式捕获端口号(如果指定了的话) 。该子表达式匹配冒号后面的零个或多个数字 。只能重复一次该子表达式 。最后,第四个括号子表达式捕获 Web 地址指定的路径和/或页信息 。该子表达式能匹配不包括 # 或空格字符的任何字符序列 。
将正则表达式应用到上面的 URI,各子匹配项包含下面的内容:

  • 第一个括号的表达式包含"http"
  • 第二个括号的表达式包含"www.w3cschool.cn"
  • 第三个括号的表达式包含":80"
  • 第四个括号的表达式包含"/html/html-tutorial.html"

正则表达式 – 语法

文章插图
 




推荐阅读