热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JScript中正则表达式用法详解

JScript中正则表达式用法详解
呵呵,先罗嗦几句,去年用C#做了一个语法高亮的小东西,根据配制文件中的信息把所给代码格式化成HTML,使它能在网页上显示出和编辑器里一样的语法元素高亮的效果以及支持代码折叠。没错,就是和博客园上看到的类似啦。因为我当时使用的是MSN Space,它没有提供这项功能,只好自己写一个咯。

    我使用的是C#进行编写,起初使用的是超级繁琐的for,while,switch,if等基本语句来判断关键字等等,大家莫笑话,本人愚笨当时还不知道正则表达式是何物,所以只能用这种土办法了,当然土办法还是有效果的,只是一个函数里冗长的代码,以后要维护起来恐怕是非常难的,心想别的软件不可能是这么写的吧,于是乎到google上搜索了一阵,找到了些语法高亮的代码和开源项目,开起来一看。。。。。晕,一个个都那么复杂,说实在我最不喜欢做的事就是看别人代码了,不是我自命不凡,实在看别人代码实在是很晕,除非是有非常详细的文档描述,要不然我瞄两眼就不想看了,顶多是看看别人接口怎么写的,然后猜测他内部怎么实现。

    虽然搜索来的东西没有多大帮助,不过还是让我知道了正则表达式这个东东,具体忘记哪里看到的了。当时就开始一边研究正则表达式一边改造偶那“破玩意儿”。接着没多久在博客园重新开博了,终于开用上博客园的语法加亮功能啦,于是自己写个代码HTML高亮显示的东东就失去了一个主要动力了。其次,用C#做的语法高亮模块,只能运行在服务器端,或者WinForm程序上,而我最终要获取的是HTML代码以显示在页面上,我认为还是客户端脚本最适合这项工作。只可惜自己对JS并不甚了解。。。后来这段时间又胡搞瞎搞别的去了,也没有再改进那个语法加亮模块了。

    昨天加班晚上加班回到家里,本来打算继续学习下UML见模,后来想起公司有一个模块需要能剔出数据库返回结果中的所有HTML标签,我便打开正则表达式工具RegexBuddy。结果RegexBuddy的帮助文档时看到了JScript使用正则表达式的简单教学,于是乎好奇心又起,打开UltraEdit-32开始写简单的Javascript试验起来。

    我的试验过程这里就不多废话再复述了,因为很多地方是反复试验绕很多弯路的,这里就直接给出试验总结出来的JScript中正则的用法。

    废话完毕,下面进入正题!   

    首相讲讲JScript的正则表达式对象RegExp。 

    JScript中提供正则表达式操作的类名为RegExp,可以用两种方式实例化RegExp类型的对象。   

    方法一,构造函数实例化: 

var myRegex = new RegExp("\\w+", "igm ");  
//\w+为实际正则表达式,注意第一个\为转义之用,igm分别表示忽略大小写,全局搜索,多行搜索,这个后面会解释  
    方法二,直接赋值法: 

var myRegex = /\w+/igm;  
//效果与上一个语句一样,只是这里不需要用转移字符,原正则表达式是什么样子就是什么样子,igm就和前面例子的igm作用一样 
    具体用什么方式看大家喜好了,个人觉得第二种方式写的正则比较好读些,RegexBuddy帮助文档也是推荐第二种方式。   RegExp对象包含以下一些操作:

    exec(string str):执行正则表达式匹配,并返回匹配结果,根据MSDN给出的例子运行结果看,exec每次执行都是从上次直接的匹配结束位置开始,并且返回的值似乎是RerExp对象,而RegexBuddy给出的解释是返回一个数组,但是没有给出详细例子,我觉得还是根据试验结果为依据比较可靠。   

    compile(string regex, string flags):预编译正则表达式以使其运行更快,经过测试的确预先编译后效率有明显提升。regex参数为正则表达式,flags可以为以下3个值的组合: g – 全局搜索,我的试验结果是不加g标志就只能匹配第一个符合条件的字符串 i – 忽略大小写 m – 多行搜索,似乎默认已经是多行搜索了   

    test(string str):如果str匹配正则表达式返回true,否则返回false,这个类似string对象的match方法   

    RegExp对象包含以下一些属性:

    index:字符串中第一个匹配表达式的位置,初始为-1   
    input:正则表达式的匹配目标,注意是只读的   
    lastIndex:下一个匹配表达式的位置,原话是(Returns the character position where the next match begins in a searched string.)也不知道有没有翻译错,这个属性我没有用到。   
    lastMatch:最后一个匹配表达式的字符串   
    lastParen:最后一个匹配的子匹配串,比如正则表达式里有多个以()分组的匹配项,lastParen表示最后一组所匹配的结果
    leftContext:从目标字符串的开头到last match的起始位置的所有字符。   
    rightContext:从last match的结束位置到整个目标字符串的结束位置的所有字符。   
    $1…$9:表示第n组匹配的结果,这个在正则表达式里有多个以()分组时有用

    接下来讲讲,JScript中String对象与正则表达式有关的操作: 

    match(string regex):接受一个正则表达式,并返回该字符串是否与这个表达式匹配。 
    replace(srting regex, string str):将与正则表达式匹配的子字符串替换为str,这个函数看似简单,不过还隐藏着更高级用法哦,请看以下例子。
    例子1: 

var str1 = "A:My name is Peter!\nB:Hi Peter!";
str1 = str1.replace(/Peter/g,"Jack");
alert(str1);
      这个例子很简单就是把字符串替换了,这则表达式的威力当然不只于此,如果你用的熟练,还能用它完成很多以往需要大量代码完成的工作。比如在代码关键字前后加上由于高亮显示的HTML标签。从前面例子看来似乎replace只能把匹配的文本替换成新的文本啊,怎么利用它在关键字前后插入标签呢?返过来想象,如果在替换时能利用匹配结果,那么事情不就好办了,只要将关键字替换为:标签头 + 关键字 + 标签尾 不就行了。

    可是要如何在replace中使用正则表达式匹配的结果呢?

    这时候我们就需要用到“匹配变量”了,匹配变量用于表示正则匹配的结果,以下是匹配变量的说明: 
    $& -- 表示全部匹配组匹配的结果,最后再啰嗦一次,匹配组就是正则表达式的()分组 
    $$ -- 表示$字符,因为匹配变量用掉了$字符,所以需要转义 
    $n -- 类似前面的$1…$9,表示第n组匹配的结果 
    $nn -- 很简单就是第nn组匹配的结果 
    $` -- 就是前面提到过的leftContext,比如abcdefg被匹配出了d那么abc就是它的leftContext了 
    $'  -- 和上面符合很接近不要看错了!,这个就是rightContext了,举一反三,efg就是上面例子的rightContext了   那么现在我们要做到在关键字前后插入标签就很简单了: 

var str1 = "A:My name is Peter!\nB:Hi Peter!";
str1 = str1.replace(/Peter/g, "$&"); 
alert(str1);
    都0:39了。。。就写到这里吧。

    正则工具软件下载(密码: regex):regex buddy 2.06.zip
    我写的例子请看:JScript做语法加亮显示(代码精简)

    一下是MSDN载抄的一些例子:

function matchDemo()
{
   var s;
   var re = new RegExp("d(b+)(d)","ig");
   var str = "cdbBdbsbdbdz";
   var arr = re.exec(str);
   s = "$1 contains: " + RegExp.$1 + "\n";
   s += "$2 contains: " + RegExp.$2 + "\n";
   s += "$3 contains: " + RegExp.$3;
   return(s);
}
function RegExpTest()
{
  var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion())
  if (ver >= 5.5){
    var src = "The rain in Spain falls mainly in the plain.";
    var re = /\w+/g;
    var arr;
    while ((arr = re.exec(src)) != null)
       print(arr.index + "-" + arr.lastIndex + "\t" + arr);
  }
  else{
    alert("You need a newer version of JScript for this to work");
  }
}

function matchDemo()
{
   var s;                                //Declare variable.
   var re = new RegExp("d(b+)(d)","ig"); //Regular expression pattern.
   var str = "cdbBdbsbdbdz";             //String to be searched.
   var arr = re.exec(str);               //Perform the search.
   s = "$1 returns: " + RegExp.$1 + "\n";
   s += "$2 returns: " + RegExp.$2 + "\n";
   s += "$3 returns: " + RegExp.$3 + "\n";
   s += "input returns : " + RegExp.input + "\n";
   s += "lastMatch returns: " + RegExp.lastMatch + "\n";
   s += "leftContext returns: " + RegExp.leftContext + "\n";
   s += "rightContext returns: " + RegExp.rightContext + "\n"; 
   s += "lastParen returns: " + RegExp.lastParen + "\n";
   return(s);                            //Return results.
}
document.write(matchDemo());


    各位路过的大侠如果对本文有什么看法欢迎在此提出,大家共同学习,共同进步。

推荐阅读
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 如何更改电脑系统的自动校时服务器地址?
    本文介绍了如何通过注册表编辑器更改电脑系统的自动校时服务器地址。通过修改注册表中的数值数据或新建字符串数值的方式,可以将默认的时钟同步服务器地址更改为自己所需要的域名或IP地址。详细步骤包括双击时间区域,点击internet时间,勾选自动校正域名设置定时等操作。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • 前言对于从事技术的人员来说ajax是这好东西,都会使用,而且乐于使用。但对于新手,开发一个ajax实例,还有是难度的,必竟对于他们这是新东西。leo开发一个简单的ajax实例,用的是 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 使用chrome编辑器实现网页截图功能的方法
    本文介绍了在chrome浏览器中使用编辑器实现网页截图功能的方法。通过在地址栏中输入特定命令,打开控制台并调用命令面板,用户可以方便地进行网页截图操作。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
author-avatar
Vicky小希希
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有