JavaScript高级程序设计(第3版)学习笔记12 js正则表达式

需要指出的是,这里只是总结了正则表达式的常用的且比较简单的语法,而不是全部语法,在我看来,掌握了这些常用语法,已经足够应对日常应用了。正则表达式不只是应用在ECMAScript中,在JAVA、.Net、Unix等也有相应应用,这篇文章则是以ECMAScript中的正则表达式为基础总结的。

一、正则表达式基础

1、普通字符:字母、数字、下划线、汉字以及所有没有特殊意义的字符,如ABC123。在匹配时,匹配与之相同的字符。

2、特殊字符:(需要时,使用反斜杠“\”进行转义)





































































































字符 含义 字符 含义 字符 含义 字符 含义
\a 响铃符 = \x07 ^ 匹配字符串的开始位置 \b 匹配单词的开始或结束 {n} 匹配n次
\f 换页符 = \x0C $ 匹配字符串的结束位置 \B 匹配不是单词开始和结束的位置 {n,} 匹配至少n次
\n 换行符 = \x0A () 标记一个子表达式的开始和结束 \d 匹配数字 {n,m} 匹配n到m次
\r 回车符 = \x0D [] 自定义字符组合匹配 \D 匹配任意不是数字的字符 [0-9] 匹配0到9中任意一个数字
\t 制表符 = \x09 {} 修饰匹配次数的符号 \s 匹配任意空白字符 [f-m] 匹配f到m中任意一个字母
\v 垂直制表符 = \x0B . 匹配除换行符外的字符 \S 匹配任意非空白字符    
\e ESC符 = \x1B ? 匹配0或1次 \w 匹配字母或数字或下划线或汉字    
\xXX 使用两位十六进制表示形式,可与该编号的字符匹配 + 匹配1或多次 \W 匹配任意不是字母、数字、下划线和汉字的字符    
\uXXXX 用四位十六进制表示形式,可与该编号的字符匹配 * 匹配0或多次 [^x] 匹配除x外的所有字符    
\x{XXXXXX} 使用任意位十六进制表示形式,可与该编号的字符匹配 | 左右两边表达式之间“或”关系 [^aeiou] 匹配除aeiou外的所有字符    

上面列举的这些特殊字符,可以大致的分为:

(1)不便书写字符:如响铃符(\a)、换页符(\f)、换行符(\n)、回车符(\r)、制表符(\t)、ESC符(\e)

(2)十六进制字符:如两位(\x02)、四位(\x012B)、任意位(\x{A34D1})

(3)表示位置字符:如字符串开始(^)、字符串结束($)、单词开始和结束(\b)、单词中间(\B)

(4)表示次数字符:如0或1次(?)、1或多次(+)、0或多次(*)、n次({n})、至少n次({n,})、n到m次({n,m})

(5)修饰字符:如修饰次数({})、自定义组合匹配([])、子表达式(())

(6)反义字符:

  (A)通过大小写反义:如\b和\B、\d和\D、\s和\S、\w和\W

  (B)通过[^]反义:如[^x]、[^aeiou]

  (C)其它特例:如\n和.也构成反义

(7)范围字符:如数字范围([0-9])、字母范围([f-m])

(8)逻辑字符:如表示或(|)

3、转义

(1)使用反斜杠“\”转义单个字符

(2)使用“\Q...\E”转义,将表达式中间出现的字符全部作为普通字符

(3)使用“\U...\E”转义,将表达式中间出现的字符全部作为普通字符,并且将小写字母转换成大写匹配

(4)使用“\L...\E”转义,将表达式中间出现的字符全部作为普通字符,并且将大写字母转换为小写匹配

4、贪婪模式与懒惰模式

   如果正则表达式中含有次数字符时,一般情况下,会尽可能匹配更多的字符,比如用l*n来匹配linjisong的话,会匹配linjison,而不是 lin,这种模式也就是正则表达式的贪婪模式;相对应的,可以通过添加字符“?”来设置为懒惰模式,也即尽可能匹配更少字符。如*?表示重复0次或多次, 但尽可能少重复。

5、分组和反向引用

(1)用小括号(())将表达式包含,可以使得表达式作为一个整体来处理,从而达到分组的目的。

(2)默认情况下,每个分组会自动获取一个组号,按照左括号的顺序,从1向后编号。

(3)引擎在处理时,会将小括号内部表达式匹配的内容保存下来,以方便在匹配过程中或匹配结束后进一步处理,可以使用反斜杠和组号来引用这个内容,如\1表示第一个分组匹配的文本。

(4)也可以自定义组名,语法是(?<name>exp),这个时候反向引用时,还可以使用\k<name>。

(5)也可以不保存匹配内容,也不分配组号,语法是(?:exp)。

(6)小括号有一些其他特殊语法,这里列举几种,不再深入讨论:

































分类 代码/语法 说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

到此,对于理解常用的正则表达式已经足够了,若想继续学习正则表达式的,可以参考正则表达式30分钟入门教程。下面再熟悉一下Javascript中的正则表达式实现。

二、Javascript中的正则表达式对象RegExp

1、创建正则表达式

(1)使用字面量:语法 var exp = /pattern/flags;

  A、pattern是任何正则表达式

  B、flags有三种:g表示全局模式、i表示忽略大小写、m表示多行模式

(2)使用RegExp内置构造函数:语法 var exp = new RegExp(pattern, flags);

  A、使用构造函数时,pattern和flags都是字符串形式,所以对于转义字符需要双重转义,例如:




















字面量 构造函数
/\[bc\]at/ "\\[bc\\]at"
/\.at/ "\\.at"
/name\/age/ "name\\/age"
/\d.\d{1,2}/ "\\d.\\d{1,2}"
/\w\\helllo\\123/ "\\w\\\\hello\\\\123"

说明:ECMAScript 3使用字面量时会共享一个RegExp实例,使用new RegExp(pattern,flags)会为每个正则表达式创建一个实例;ECMAScript 5规定每次都创建新实例。

2、实例属性

(1)global:布尔值,表示是否设置了g标志。

(2)ignoreCase:布尔值,表示是否设置了i标志。

(3)multiline:布尔值,表示是否设置了m标志。

(4)lastIndex:整数,表示开始搜索下一次匹配项的字符位置,从0算起。

(5)source:字符串,表示按照字面量形式创建的字符串模式,即便实例使用构造函数创建,存储的也是字面量形式的字符串模式。

3、实例方法

(1)exec()方法

  A、一个参数,即要应用模式的字符串,返回第一个匹配项信息的数组,没有匹配时返回null。

  B、返回的数组是Array实例,但还额外有input和index属性,分别表示应用正则表达式的字符串和匹配项在字符串中的位置。

  C、匹配时,在返回的数组中,第1项是与整个模式匹配的字符串,其他项是与模式中的分组匹配的字符串(如果没有分组,则返回数组只有1项)。

  D、对于exec(),即使设置了g,每次返回的也是一个匹配项,不同的是,设置了g,多次调用exec的开始搜索位置不同,没有设置g,每次都从开始搜索。

(2)test()方法

  接受一个字符串参数,匹配返回true,不匹配返回false。

三、实例分析

下面看一个出自PhoneGap源码中用于格式化的正则表达式

代码如下:

var pattern = /(.*?)%(.)(.*)/;
var str = 'lin%%jisong';
var match = pattern.exec(str);
console.info(match.join(','));//lin%%jisong,lin,%,jisong

var pattern2 = /(.*)%(.)(.*)/;
var match2 = pattern2.exec(str);
console.info(match2.join(','));//lin%%jisong,lin%,j,isong

分析:这里pattern和pattern2都包含三个分组,第2、3个分组相同,第2个分组(.)匹配任意一个非换行字符,第3个分组(.*)尽可能多(贪婪模式)的匹配任意非换行字符,pattern中的第1个分组(.*?)尽可能少(懒惰模式)的匹配任意非换行字符,而pattern2中的第1个分组(.*)则是尽可能多(贪婪模式)的匹配任意非换行字符了。因此在保证整个模式匹配成功(从而需要保留一个%字符用于匹配正则表达式中的%)的前提下,pattern中第1个分组匹配成了lin,而pattern2中第1个分组匹配成了lin%,分析到这里上例中的输出也就不难理解了。

(0)

相关推荐

  • 经典Javascript正则表达式[优质排版]

    匹配中文字符的正则表达式: 复制代码 代码如下: [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内): 复制代码 代码如下: [^\x00-\xff] 应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 复制代码 代码如下: String.prototype.len=function(){ return this.replace([^\x00-\xff]/g,"aa").length; } 匹配空行的正则表达式: 复制代码 代码如下: \n[\s|]*\r

  • JavaScript中的正则表达式简明总结

    一.定义正则表达式的方法 定义正则表达式的方法有两种:构造函数定义和正则表达式直接量定义.例如: 复制代码 代码如下: var reg1 = new RegExp('\d{5, 11}'); // 通过构造函数定义var reg2 = /\d{5, 12}/; // 通过直接量定义 正则表达式直接量字符       \o:NUL字符(\u0000)       \t:制表符(\u0009)       \n:换行符(\u000A)       \v:垂直制表符(\u000B)       \f:

  • javascript中正则表达式反向引用示例介绍

    最近遇到一个需求,传入一个字符串,每三个字符插入一个空格 例: 传入abcd1234 输出 abc d12 34 思考了一下,准备写一个函数如下 复制代码 代码如下: function appendSpace(s) { var length = s.length; var result = ""; var last = 0; for(var i = 3;i<=length;i=i+3,last = last+3) { result = result+s.substring(i-3

  • JavaScript去除空格的三种方法(正则/传参函数/trim)

    方法一: 个人认为最好的方法.采用的是正则表达式,这是最核心的原理. 其次.这个方法使用了JavaScript 的prototype 属性 其实你不使用这个属性一样可以用函数实现.但这样做后用起来比较方便. 下面就来看看这个属性是怎么来用的. 返回对象类型原型的引用. objectName.prototype objectName 参数是对象的名称. 说明 用 prototype 属性提供对象的类的一组基本功能.对象的新实例"继承"赋予该对象原型的操作. 例如,要为 Array 对象添

  • javascript 正则表达式相关应介绍

    string 对象 1.str.match(RegExp) 在str中搜索匹配RegExp的字符串并保存在一个数组内返回, 如果RegExp不是全局设置(/g),仅匹配一次 复制代码 代码如下: ("abc112dwfwabcwef2abc3wfwabcasqf453abcqwf24j234h").match(/abc\d*/g); //结果 ["abc112", "abc", "abc3", "abc",

  • 巧解 JavaScript 中的嵌套替换(强大正则)

    网友wys提问:如何仅使用JavaScript支持的正则语法,将 复制代码 代码如下: <p> <table> <p> <p> </table> <table> <p> <p> </table> <p> 中<table>...</table>之间的<p>都替换为<br/>? 思考 该问题的难点之一在于JavaScript支持的正则特性实在有

  • JavaScript通过正则表达式实现表单验证电话号码

    JavaScript表单验证电话号码,判断一个输入量是否为电话号码,通过正则表达式实现. 复制代码 代码如下: //检查电话号码 function isTel(str){ var reg=/^([0-9]|[\-])+$/g ; if(str.length18){ return false; } else{ return reg.exec(str); } }

  • javascript正则表达式容易被忽略的小问题整理

    一.中括号[]里面的特殊字符是不用转义的,例如[/].[.].[*].[?].[+]都是可以直接匹配对应的字符\ . *?+.下面是测试结果: 所以,/[\d.]/这个正则表达式实际上是匹配数字字符或者字符".",作用等同于/[\d\.]/ 二.match()和exec()的区别 二者的区别主要在于正则表达式在设置了全局标识符g的情况. 如果没有设置全局标识符g,那么调用string.match(regexp)的结果和调用regexp.exec(string)的结果是相同的, 但在设置

  • javascript正则表达式基础篇

    正则表达式:语法:/expression/,斜杠表示起始位置 创建方式: 1.var regObj = new RegExp("pattern",[,"flags"]);        pattern:必选项,正则表达式的字符串:        flags:可选项,一些标志组合.    2.var regObj = /pattern/[flags];该方式不能用引号将pattern和flags括起来. 正则表示对象RegExp对象的方法: exec:检索字符中是正则

  • JavaScript表单通过正则表达式验证电话号码

    JavaScript表单验证电话号码,判断一个输入量是否为电话号码,通过正则表达式实现. 复制代码 代码如下: //检查电话号码 function isTel(str){ var reg=/^([0-9]|[\-])+$/g ; if(str.length<7 || str.length>18){ return false; } else{ return reg.exec(str); }

  • javascript正则匹配汉字、数字、字母、下划线

    javascript正则检测只含有汉字.数字.字母.下划线不能以下划线开头和结尾 遇到一个用户名检测的的问题,查了一下,总结例子如下: 复制代码 代码如下: var reg = /^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$/;if (!reg.test(实际取值的字符串)) {    alert('请输入5-24位字符:支持中文.英文.数字."_",推荐使用中文');}

  • JavaScript正则表达式验证中文实例讲解

    JavaScript经常会验证中文,这里提供两个例子: Javascript代码: 复制代码 代码如下: /** *A simple example */ function ischinese(temp){ var re = /[^u4e00-u9fa5]/; if(re.test(temp)) return false; return true; } <p>/** *校验字符串是否为中文 *返回值: *如果为空,定义校验通过, 返回true *如果字串为中文,校验通过, 返回true *如果

  • 如何使用JavaScript和正则表达式进行数据验证

    数据验证是网络应用软件从客户端接受数据的重要步骤,毕竟,您需要在使用客户数据前确保其符合预期的格式.在网络应用程序中,您可以选择使用特定平台的工具,比如ASP.NET.JSP等等,或者您可以利用客户端JavaScript的优势,JavaScript中的正则表达式可以简化数据验证的工作. 正则表达式 正则表达式是一种模式匹配的工具,它允许您以文字方式来表述模式,因而正则表达式成为了一个验证文本数据的强大工具.除了模式匹配之外,正则表达式还可以用于文字替换.从我在UNIX系统上使用Perl时第一次接

  • 正则表达式语法规则及在Javascript和C#中的使用方法

    一.正则表达式概念: 在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容.许多程序设计语言都支持利用正则表达式进行字符串操作. 二.正则表达式的使用: 正则表达式在ASP.NET中主要是用来对输入的内容进行验证,验证一般分为两种一种是客户端JS验证,另一种是服务器端验证 1.JS对输入内容验证 复制代码 代码如下: function check() {           

  • 常用的JavaScript验证正则表达式汇总

    下面都是我收集的一些比较常用的正则表达式,因为平常可能在表单验证的时候,用到的比较多.特发出来,让各位朋友共同使用.呵呵. 匹配中文字符的正则表达式: [u4e00-u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff]评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r评注:可以用来删除空白行 匹配HTML标记的正则表达式:< (S*?)[^>]*>.*?|<

  • javascript中使用正则表达式实现删除字符串中的前后空格

    实例 复制代码 代码如下: <script> var str=" yexj00 "; str=str.replace(/^s*|s*$/g,''); alert(str); </script> 实例 模仿RTrim: 复制代码 代码如下: <script> var str="yexj00 "; str=str.replace(/s*$/g,''); alert(str); </script> 实例 代码以及测试代码如下

  • 如何使用Javascript正则表达式来格式化XML内容

    使用得是Emeditor ,在看XML文档时,总是因为格式混乱而看不清.这个是一个Emeditor宏来自动格式化XML.下载:formatXml.rar(1,021.00 bytes)下面这段是这个网页版的javascript格式化XML的代码. 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head>    <meta http-

  • javascript中使用正则表达式进行字符串验证示例

    var reg=/正则表达式/: boolean reg.test(要验证的字符串); js引擎会将/正则表达式/""转换成一个RegExp对象,当字符串满足正则表达式的要求事,返回true. 我写的一个表达式验证示例:功能如下: 用户名,不能为空 密码6为数字 密码确认,两次输入密码必须相同 身份证号码必须是15位,或者是18位,最末尾也可以是X(该功能还没有写,有时间再补上) 复制代码 代码如下: <!DOCTYPE html> <html> <hea

随机推荐