VBS教程:正则表达式简介 -后向引用

后向引用

正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。请回想一下,对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对这部分正则表达式的保存。

所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。

后向引用一个最简单,最有用的应用是提供了确定文字中连续出现两个相同单词的位置的能力。请看下面的句子:

Is is the cost of of gasoline going up up?

根据所写内容,上面的句子明显存在单词多次重复的问题。如果能有一种方法无需查找每个单词的重复现象就能修改该句子就好了。下面的 Visual Basic Scripting Edition 正则表达式使用一个子表达式就可以实现这一功能。

/\b([a-z]+) \1\b/gi

等价的 VBScript 表达式为:

"\b([a-z]+) \1\b"

在这个示例中,子表达式就是圆括号之间的每一项。所捕获的表达式包括一个或多个字母字符,即由'[a-z]+' 所指定的。该正则表达式的第二部分是对前面所捕获的子匹配的引用,也就是由附加表达式所匹配的第二次出现的单词。'\1'用来指定第一个子匹配。单词边界元字符确保只检测单独的单词。如果不这样,则诸如 "is issued" 或 "this is" 这样的短语都会被该表达式不正确地识别。

在 Visual Basic Scripting Edition 表达式中,正则表达式后面的全局标志 ('g') 表示该表达式将用来在输入字符串中查找尽可能多的匹配。大小写敏感性由表达式结束处的大小写敏感性标记 ('i') 指定。多行标记指定可能出现在换行符的两端的潜在匹配。对 VBScript 而言,在表达式中不能设置各种标记,但必须使用 RegExp 对象的属性来显式设置。

使用上面所示的正则表达式,下面的 Visual Basic Scripting Edition 代码可以使用子匹配信息,在一个文字字符串中将连续出现两次的相同单词替换为一个相同的单词:

var ss = "Is is the cost of of gasoline going up up?.\n";var re = /\b([a-z]+) \1\b/gim;       //创建正则表达式样式.var rv = ss.replace(re,"$1");   //用一个单词替代两个单词.

最接近的等价  VBScript 代码如下:

Dim ss, re, rvss = "Is is the cost of of gasoline going up up?." & vbNewLineSet re = New RegExpre.Pattern = "\b([a-z]+) \1\b"re.Global = Truere.IgnoreCase = Truere.MultiLine = Truerv = re.Replace(ss,"$1")

请注意在 VBScript 代码中,全局、大小写敏感性以及多行标记都是使用 RegExp 对象的适当属性来设置的。

replace 方法中使用 $1 来引用所保存的第一个子匹配。如果有多个子匹配,则可以用 $2, $3 等继续引用。

后向引用的另一个用途是将一个通用资源指示符 (URI) 分解为组件部分。假定希望将下述的URI 分解为协议 (ftp, http, etc),域名地址以及页面/路径:

http://msdn.microsoft.com:80/scripting/default.htm

下面的正则表达式可以提供这个功能。对 Visual Basic Scripting Edition,为:

/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/

对 VBScript 为:

"(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"

第一个附加子表达式是用来捕获该 web 地址的协议部分。该子表达式匹配位于一个冒号和两个正斜杠之前的任何单词。第二个附加子表达式捕获该地址的域名地址。该子表达式匹配不包括 '^'、 '/' 或 ':' 字符的任何字符序列。第三个附加子表达式捕获网站端口号码,如果指定了该端口号。该子表达式匹配后跟一个冒号的零或多个数字。最后,第四个附加子表达式捕获由该 web 地址指定的路径以及\或者页面信息。该子表达式匹配一个和多个除'#' 或空格之外的字符。

将该正则表达式应用于上面所示的 URI 后,子匹配包含下述内容:

RegExp.$1 包含 "http"

RegExp.$2 包含 "msdn.microsoft.com"

RegExp.$3 包含 ":80"

RegExp.$4 包含 "/scripting/default.htm"

(0)

相关推荐

  • 正则中的回溯定义与用法分析【JS与java实现】

    本文实例分析了正则中的回溯定义与用法.分享给大家供大家参考,具体如下: 关于"回溯"我也是第一次接触,对它也不算很了解.下面就把我所了解的做为一个心德记录下来,以备查看. 我们所使用的正则表达式的匹配基础大概分为:优先选择最左端(最靠开头)的匹配结果和标准的匹配量词(*.+.?和{m, n})是匹配优先的. "优先选择最左端的匹配"顾名思义就是从字符串的起始位置开始匹配直到匹配结束这是基础:"标准匹配量词"又分为"非确定型有穷自动机(N

  • 深度分析正则(pcre)最大回溯/递归限制

    今天,Tank问了一个问题, 对于如下的正则: 复制代码 代码如下: /<script>.*?<\/script>/i 当要匹配的字符串长度大于100014的时候, 就不会得出正确结果: 复制代码 代码如下: $reg = "/<script>.*?<\/script>/is"; $str = "<script>********</script>"; //长度大于100014 $ret = pr

  • PHP正则表达式的效率 回溯与固化分组

    先来看下问题. 字符串 复制代码 代码如下: $str = '<script>123456</script>'; 正则表达式为 复制代码 代码如下: $strRegex1 = '%<script>.+<\/script>%'; $strRegex2 = '%<script>.+?<\/script>%'; $strRegex3 = '%<script>(?:(?!<\/script>).)+<\/scri

  • 详解JavaScript正则表达式之分组匹配及反向引用

    语法 元字符:(pattern) 作用:用于反复匹配的分组 属性$1~$9 如果它(们)存在,用于得到对应分组中匹配到的子串 \1或$1 用于匹配第一个分组中的内容 \2或$2 用于匹配第一个分组中的内容 ... \9或$9 用于匹配第一个分组中的内容 用法示例 var reg = /(A+)((B|C|D)+)(E+)/gi;//该正则表达式有4个分组 //对应关系 //RegExp.$1 <-> (A+) //RegExp.$2 <-> ((B|C|D)+) //RegExp.

  • PHP正则表达式的逆向引用与子模式分析

    正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力. 对一个正则表达式模式或部分模式两边添加圆括号()可以把这部分表达式存储到一个临时缓冲区中. 所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容按顺序存储. 存储子匹配的缓冲区编号从1开始,连续编号至最大99个子表达式. 每个缓冲区都可以使用'\n'(或用'$n')访问,其中n为1至99的阿拉伯数字,用来按顺序标识特定缓冲区(子表达式). 例1:最简单最有用的例子是确定文字中连续出现两个相同单词的位置

  • 正则表达式学习教程之回溯引用backreference详解

    本文实例讲述了正则表达式回溯引用backreference.分享给大家供大家参考,具体如下: 在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.问题引入 一个在HTML页面中匹配标题标签(H1-H6)的问题: 文本: <body> <h1>Welcome to my page</H1> Content is divid

  • 正则表达式之回溯

    关于"回溯"我也是第一次接触,对它也不算很了解.下面就把我所了解的做为一个心德记录下来,以备查看. 我们所使用的正则表达式的匹配基础大概分为:优先选择最左端(最靠开头)的匹配结果和标准的匹配量词(*.+.?和{m, n})是匹配优先的. "优先选择最左端的匹配"顾名思义就是从字符串的起始位置开始匹配直到匹配结束这是基础:"标准匹配量词"又分为"非确定型有穷自动机(NFA)"也可以叫做"表达式主导":另外一种

  • 编写高质量的js之正确理解正则表达式回溯

    当一个正则表达式扫描目标字符串时,从左到右逐个扫描正则表达式的组成部分,在每个位置上测试能不能找到一个匹配.对于每一个量词和分支,都必须确定如何继续进行.如果是一个量词(如*.+?或者{2,}),那么正则表达式必须确定何时尝试匹配更多的字符:如果遇到分支(通过|操作符),那么正则表达式必须从这些选项中选择一个进行尝试. 当正则表达式做出这样的决定时,如果有必要,它会记住另一个选项,以备返回后使用.如果所选方案匹配成功,正则表达式将继续扫描正则表达式模板,如果其余部分匹配也成功了,那么匹配就结束了

  • PHP 正则表达式效率 贪婪、非贪婪与回溯分析(推荐)

    先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词? 好吧,我也不知道概念是什么,来举个例子吧. 某同学想过滤之间的内容,那是这么写正则以及程序的. $str = preg_replace('%<script>.+?</script>%i','',$str);//非贪婪 看起来,好像没什么问题,其实则不然.若 $str = '<script<script>alert(document.cookie)</script&

  • JavaScript正则表达式之后向引用实例代码

    function isIP(strIP) { if (strIP=="") return false; var re=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g //匹配IP地址的正 则表达式 if(re.test(strIP)) { if( RegExp.$1 function RegExpTest(){ var src = ""; var re = /]*)>/g; var arr,msg=""; while ((a

  • AS3 js正则表达式 反向引用(backreference)

    as3代码: var str = ""; var reg = /(\d{}) \/gx; // \ 即为反向分组,代表前一个分组相同的匹配结果字符.如\d{} 匹配了,那么\也只能为匹配, var first=str.match(reg); //match(),返回一个对象,如果reg有全局属性g,对象的数字索引为各完全匹配字符, //如果无全局属性g,索引为第一次完全匹配字符,其他索引依次为各分组匹配字符 for(var key in first) { trace("第一次

  • 小议正则表达式效率 贪婪、非贪婪与回溯

    先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词? 好吧,我也不知道概念是什么,来举个例子吧. 某同学想过滤之间的内容,那是这么写正则以及程序的. 复制代码 代码如下: $str = preg_replace('%<script>.+?</script>%i','',$str);//非贪婪 看起来,好像没什么问题,其实则不然.若 复制代码 代码如下: $str = '<script<script>alert(docume

  • php正则表达式的模式修正符和逆向引用使用介绍

    正则表达式的匹配先后顺序: 1.模式单元 2.重复匹配 ? * + {} 3.边界限定 ^ $ b B 4.模式选择 | 模式修正符: 模式修正符是标记在整个模式之外的. i :模式中的字符将同时匹配大小写字母. m :字符串视为多行. s :将字符串视为单行,换行符作为普通字符. x :将模式中的空白忽略. A :强制仅从目标字符串的开头开始匹配. D :模式中的美元元字符仅匹配目标字符串的结尾. U :匹配最近的字符串. PHP与正则表达式中的模式修正符 下面列出了当前在 PCRE 中可能使

随机推荐