网络编程
位置:首页>> 网络编程>> JavaScript>> Javascript正则表达式基础

Javascript正则表达式基础

作者:lunaticsun 来源:Alipay UED 发布时间:2009-02-01 18:13:00 

标签:正则表达式,RegExp,JavaScript,字符串

RegExp对象的语义和使用:

  • 检查字符串匹配

  • 获取字符串中的部分内容

  • 在原字符串的基础上构建一个新的字符串(包括添加、删除和修改)

构建一个RegExp对象主要有两种方法:

  • 使用literal,如/\w/g

  • 使用构造函数,如 new RegExp(/\w/)

构建RegExp对象有以下几个注意点:

  • literal常用来构建非runtime产生的静态的RegExp对象

  • literal之后可以直接添加flag用来对匹配字符串的执行结果进行限制,常用flag包括g和i,分别用来表示全局匹配(global)和忽略大小写匹配(case-insensitive)

  • RegExp构造函数的第一个参数提供该对象的pattern,如果pattern是一个RegExp literal,那么就不能提供第二个参数(即指定flag)。如果pattern是一个string,那么可以使用第二个参数

  • RegExp构造函数常用于构建runtime产生的动态RegExp对象

  • RegExp的pattern为string时所有literal中的”\”都必须写成”\\”,因为”\”在string中需要被转义

  • 以上两种方法构建的都一个javascript对象,因此/\w/ == /\w/返回false


RegExp对象相关的功能:

  • 要检查字符串的匹配,可以使用 regExp.test(string) 方法,该方法检查string是否匹配regExp提供的pattern。还可以使用 string.search(regExp)方法,如果两者不匹配将会返回-1

  • 要获取字符串中的部分内容,可以使用 regExp.exec(string) 方法,也可以使用string.match(regExp)方法

  • 要在原有字符串上构建一个新的字符串,通常使用string.replace(searchValue, replaceValue)方法

RegExp对象中提供pattern的语义:

  • RegExp可以定义多个Alternative用”|”分割,该运算的优先级最低,因此如果存在”|”,那么它首先把RegExp分割成几大部分

  • 每个Alternative由多个term组成,term分为assertion(用于位置限定),atom(匹配的单元),带Quantifier(修饰符)的atom

  • assertion分为”^”用于匹配字符串开头,在multiInput(即flag包含m时),也可以匹配一行的开头,”$”用于匹配字符串结尾,在multiInput(即flag包含m时),也可以匹配一行的结尾,”\b”用于匹配一个\w和\W间隔,注意它并不匹配任何字符串中的内容,而只是用来判断一个位置的匹配情况

  • atom的情况比较复杂,我们首先来看atom的Quantifier,可以包含* + ? {n} {m,} {m,n},其中*表示atom可以有0次或以上的重复,+表示1次或以上的重复,?表示0或1次,{n}表示恰巧n次重复,{m,}表示m或以上的重复,{m,n}表示重复次数在m和n之间(包含m和n),在以上的Quantifier之后还可以跟一个?用来启动non-greedy模式,我将在后文中说明这种模式的意义。

  • atom包含patternCharacter(普通字符,即在pattern中没有特殊语义的字符,匹配时将按照字面进行匹配)

  • “.” 匹配所有非line-terminator字符

  • \AtomEscape 包含数字型 \1(用于引用之前的括号中的匹配成功的内容)。一些字符的引用\n \f \r \t \v \xNN \uXXXX \cX等。一些特殊含义的字符,如\d \D \s \S \w \W

  • CharacterClass,包含[...]和[^...]两种形式。其中可以包含很多字符,如-、 \n等字符引用、\b、\d等特殊含义字符。注意如果”-”左右有字符,那么语义变为从某一字符到某一字符。如果”-”左或者右没有字符,那么”-”仅表示dash字符。

  • (group),以上模式进行group就可以在group之后使用Quantifier修饰

  • (?:group),仅作为group使用,而不会记录group匹配的内容从而不算在\1..\n中

  • (?=group),要求匹配但不会在返回的匹配string中包含group匹配的内容

  • (?!group),要求不匹配且不会在返回的匹配string中包含group匹配的内容

下面我要讲一下RegExp的两个比较重要的运作模式:

匹配Alternative总是从左到右,如果遇到第一个匹配的就不再尝试之后的匹配,如

/ab|abc/.exec("abc")

以上字符串”abc”仅匹配pattern中的ab,而不会去匹配abc

匹配时总是一般不在Quantifier后添加?的都使用greedy模式,添加?后使用non-greedy模式,如

/\w+bc/.exec("abcbcbc")

匹配时\w+总是先尽可能多的匹配(即greedy模式),因此它会匹配”abcbcbc”,如果改为

/\w+?bc/.exec("abcbcbc")

那么他会尽可能少的匹配(即non-greedy模式),因此仅匹配”abc”。

对于一般的解析字符串的要求,一般可以使用exec或match方法解析,如果字符串很大那么往往需要使用循环结构进行解析,配合while等语句,RegExp是很强大的。

对于要将现有的一个字符串通过修改转变为另一个字符串时,一般总是使用replace方法,这个方法是我觉得RegExp中最重要的方法,它的多态性使他具有多种形式,几乎能够满足所有修改字符串的需求。

0
投稿

猜你喜欢

  •  use mysql;        u
  • 今天闲逛在网上时,看到一个11px大小的字体,显示却很清晰,赶紧查看站点的CSS,这字体称叫做:PMingLiu。效果相当不错,相比于我们使
  • 关于SQL Server数据库的一切信息都保存在它的系统表格里。我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格。但是,你
  • 阅读上一篇教程:WEB2.0网页制作标准教程(9)第一个CSS布局实例如果我们想在3列布局的最后加一行页脚,放版权之类的信息。就遇到必须对齐
  • 如何远程注册DLL?试试下面的代码:<% Response.Buffer = True %&g
  • 看看下面这个刚才提到的下拉列表的例子,就是将Application Object作为一个变量用来存储下拉列表的菜单项的:<%=&nbs
  •  很早以前就有很多关于用CSS制作的相册,今天突然想看又找不到,反正也无聊,自己做了一下,结果做一下发现自己温习了一些东西。还行,
  • 呵呵,我之前也写过一个类似的模板替换功能.>> 已实现:>、<、>=、<=、=、==等简单的运算>
  • 你喜欢在博客文章中使用图片吗?是的,如果不是很麻烦的话,相信大家都不会介意放上几张漂亮的图片来点缀一下内容的,不过你的图片可能会导致下面的两
  • 我想没多少人敢保证写JavaScript能不用调试,那选择用什么方式调试会比较好呢?告别了我最爱的alert("MM")
  • 程序设计是困难的,其核心是管理的复杂性。计算机程序是人类做出的最复杂的东西。质量是不可靠的且隐蔽的。好的体系架构是必需给程序足够的结构使其健
  • Q: 不知xml和html有什么区别?它们不同在哪? A: 关于XML和HTML区别请参考: http://www.w3c.org/Mark
  • 1. 横排往下会影响阅读速度。如12345678的单排单列数字,肯定是竖排阅读快。但多行多列的整块信息,横排并不见得就比竖排慢,比如所有简体
  •  本篇已得到原作者Steve Dennis的翻译准予,在此Jorux表示感谢!本教程主要参考Creating a CSS Layo
  • 有时候想为我们的网页提供多语言支持,如果一种语言用一张网页来做实在太麻烦了,幸好Google提供了语言工具功能,下面介绍如何利用它来实现网页
  • 验证关键词是否为sql保留字的在线工具:<html>      <head><t
  •     你一定很喜欢像QQ或者MSN好友登录提示的效果吧,那么怎么样能在网页中实现呢?asp之家为大家找到了这
  • 如何在ADO中使用SQL函数?代码见下:<%Set conn1 = Server.CreateObjec
  • 1.如何将Query String传送到另一个ASP文件去?Response.Redirect("second.asp? 
  • 下面两个函数实现了对字符串中数字的判断。function   isnaw(str)   f
手机版 网络编程 asp之家 www.aspxhome.com