VBS正则表达式对象的MultiLine属性

Introduction to Regular Expressions(正则表达式简介) 一章中的 Backreferences(向后引用)一节:


代码如下:

'使用上面所示的正则表达式,下面的 JScript 代码可以使用子匹配信息,在一个文字字符串中将连续出现两次的相同单词替换为一个相同的单词:
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, rv
ss = "Is is the cost of of gasoline going up up?." & vbNewLine
Set re = New RegExp
re.Pattern = "\b([a-z]+) \1\b"
re.Global = True
re.IgnoreCase = True
re.MultiLine = True
rv = re.Replace(ss,"$1")请注意在 VBScript 代码中,全局、大小写敏感性以及多行标记都是使用 RegExp 对象的适当属性来设置的。

需要注意的是 VBScript 中多行标记和 Perl 兼容的正则表达式中的多行标记并不完全一样:

如果 multiline 为 false,那么 "^" 匹配字符串的开始位置,而 "$" 匹配字符串的结束位置。如果 multline 为 true,那么 "^" 匹配字符串开始位置以及 "\n" 或 "\r" 之后的位置,而 "$" 匹配字符串结束位置以及 "\n" 或 "\r" 之前的位置。

而在 Perl 中,如果设置了多行标记,"^" 匹配字符串开始位置以及 "\n" 之后的位置,而 "$" 匹配字符串结束位置以及 "\n" 之前的位置。也就是 Perl 兼容的正则表达式并不匹配 "\r",这跟 Linux 系统中文本的换行符与 Windows 系统中不一样有关。Linux 系统中文本的换行符为 "\n",而 Windows 系统中为 "\r\n",这就导致了正则表达式的不同。

VBS 正则表达式 MultiLine 属性的这个特性可能会导致某些问题,所以在用 VBS 正则表达式处理文本时我一般会先把 "\r\n" 替换成 "\n":


代码如下:

Dim fso, str
Set fso = CreateObject("scripting.filesystemobject")
str = fso.OpenTextFile("demon.txt")
str = Replace(str, vbCrLf, vbLf)

原文: http://demon.tw/programming/vbs-regexp-multiline.html

(0)

相关推荐

  • VBS正则表达式对象的MultiLine属性

    在 Introduction to Regular Expressions(正则表达式简介) 一章中的 Backreferences(向后引用)一节: 复制代码 代码如下: '使用上面所示的正则表达式,下面的 JScript 代码可以使用子匹配信息,在一个文字字符串中将连续出现两次的相同单词替换为一个相同的单词: var ss = "Is is the cost of of gasoline going up up?.\n"; var re = /\b([a-z]+) \1\b/gim

  • JS中正则表达式要注意lastIndex属性

     说明 这篇文章,主要和大家聊聊JavaScript中RegExp对象的属性. 解释 每个RegExp对象都包含5个属性,source.global.ignoreCase.multiline.lastIndex. source:是一个只读的字符串,包含正则表达式的文本. var reg = /JavaScript/; reg.source; //返回 JavaScript global:是一个只读的布尔值,看这个正则表达式是否带有修饰符g. 修饰符g,是全局匹配的意思,检索字符串中所有的匹配.

  • VBS创建正则表达式对象的两种方法

    一直以来,我都是用 New RegExp 来创建正则表达式对象的: Set regex = New RegExp然而最新才发现 VBS 的正则表达式对象也可以这样创建: Set regex = CreateObject("VBScript.RegExp")貌似我看过的 VBScript 书籍没有一本介绍过这种写法,当然,书上没写的东西还有很多. 既然提到了正则表达式,那么就顺便说一下,VBS 的正则表达式对象是支持 MultiLine 模式的,对象有一个 MultiLine 属性.运行

  • 详解JavaScript正则表达式中的global属性的使用

    global是正则表达式对象的只读布尔属性.它指定是否一个特定的正则表达式进行全局匹配.否则它使用"g"属性创建. 语法 RegExpObject.global 下面是参数的详细信息: NA 返回值: 如果"g"修改被设置返回"TRUE",否则返回"FALSE". 例子: <html> <head> <title>JavaScript RegExp global Property</t

  • 在ASP中用“正则表达式对象”来校验数据的合法性

    我们在制作网站的时候,尤其是各种电子商务网站,首先都会让用户填写一些表格来获取注册用户的各种信息,因为用户有可能输入各式各样的信息,而有些不符合要求的数据会给我们的后端ASP处理程序带来不必要的麻烦,甚至导致网站出现一些安全问题.因此我们在将这些信息保存到网站的数据库之前,要对这些用户所输入的信息进行数据的合法性校验,以便后面的程序可以安全顺利的执行.所以我们一般会在后端编写一个ASP的校验程序来分析用户输入的数据是否是合法的. 或许有人会问了,使用运行在客户端的JavaScript不是可以更好

  • JavaScript正则表达式中的ignoreCase属性使用详解

    ignoreCase是正则表达式对象的只读布尔属性.它指定是否一个特定的正则表达式执行不区分大小写的匹配.,它与"i"属性创建. 语法 RegExpObject.ignoreCase 下面是参数的详细信息: NA 返回值: 如果"i"修改被设置返回"TRUE",否则返回"FALSE". 例子: <html> <head> <title>JavaScript RegExp ignoreCase

  • vbs正则表达式代码

    <% Function RegExpTest(patrn, strng)     Dim regEx, Match, Matches '建立变量.     Set regEx = New RegExp '建立正则表达式.          regEx.Pattern = patrn'设置模式.          regEx.IgnoreCase = True '设置是否区分字符大小写.          regEx.Global = True '设置全局可用性.     Set Matches 

  • 在ASP中用正则表达式对象来校验数据的合法性

    我们在制作网站的时候,尤其是各种电子商务网站,首先都会让用户填写一些表格来获取注册用户的各种信息,因为用户有可能输入各式各样的信息,而有些不符合要求的数据会给我们的后端ASP处理程序带来不必要的麻烦,甚至导致网站出现一些安全问题.因此我们在将这些信息保存到网站的数据库之前,要对这些用户所输入的信息进行数据的合法性校验,以便后面的程序可以安全顺利的执行.所以我们一般会在后端编写一个ASP的校验程序来分析用户输入的数据是否是合法的. 或许有人会问了,使用运行在客户端的JavaScript不是可以更好

  • 通过event对象的fromElement属性解决热区设置主实体的一个bug

    点击"设为主实体"这个超链接后,原来的提示框会变色,而且会显示内容:"已经设置为合并主实体". 问题:当a热区的提示框上的超链接下面有另一个热区b的时候,点击a热区提示框的超链接后,会触发b热区的mouseover事件,导致a热区的提示框会消失. 这个问题我苦思了好久也找不到解决方法,上星期周俊提示我可以检测一下事件的来源元素.我突然想到IE的event对象有一个属性 fromElement,测试了一下,果然在点击a热区提示框的超链接后,b热区的mouseover事

  • Three.js中网格对象MESH的属性与方法详解

    前言 本文主要给大家介绍了关于Three.js网格对象MESH的属性与方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 创建一个网格需要一个几何体,以及一个或多个材质.当网格创建好之后,我们就可以将它添加到场景中并进行渲染.网格对象提供了几个属性和方法用于改变它在场景中的位置和显示效果. 如下: 还有一个属性就是visible属性,默认为true,如果设置为false,THREE.Mesh将不渲染到场景中. mesh对象的前三个属性position,rotation和scal

随机推荐