JS中的正则表达式及pattern的注意事项

RegExp对象的创建:

  常规的正则表达式的创建可用直接量,即斜杠 “/” 括起来的字符。但在要求参数变化的环境下,RegExp()构造函数是更好的选择:

var reg1 = /'\w+'/g;
var reg2 = new RegExp('\'\\w+\'','g');

  对比两种创建方式,RegExp中的第一个参数为要创建的正则字符串,一方面注意,因为不是直接量的表示形式,因此不用斜杠“ / ”括起来了;而是字符串中必须要对引号“ ‘ ”和转义符号“ \ ”进行二次转义。

  此外,无论是直接量还是RegExp()构造函数,都是生成了新的RegExp对象,并将其赋值给变量。

在《Javascript权威指南》一书中讲到,对于正则表达式的直接量,ECMAscript 3规定在每次它时都会返回同一个RegExp对象,因此用直接量创建的正则表达式的会共享一个实例。直到ECMAScript 5才规定每次返回不同的实例。

各浏览器中,IE一直遵守ECMAScript 5中的规定,其他浏览器的较老版本则遵循ECMAScript 3的规定。因此在实际应用中,采取构造函数创建的方法比较安全,或者在使用lastIndex属性时要记得归0。

括号()的使用:

  1、分组

  即把单独项组合成子表达式统一处理,一般用于?、+、*、{n,m}等的重复处理。见例子:

var reg = /Java(script)?/;

式子里将script进行统一处理。

  2、向后引用

  即在正则表达式中用“\n”(n代表引用的序号)引用式中前面括号中匹配的文本。见例子:

var reg = /(\d+)[a-z]{3}\1/;
//20man20
//20man23 错
//reg = /\1[a-z]{3}(\d+)/; 错

  注意 “\n”引用的是前面匹配的文本" 20 ",而不是匹配的正则表达式" \d+ "。另外,JS里只能引用前面的匹配文本,像例子中的将 \1写在括号引用的前面,将不会匹配到任何文本,浏览器中会提示出错。同样,JS里也不支持类似“ (?<name>exp) ”(exp为正则字符)的引用命名规则,只支持数字的引用。

  既然提到了分组和引用,如果只想进行分组,而不想引用,则可用 "(?: exp)"的形式,既不匹配文本,也不给引用编号。见例子:

var reg = /(\w{3})(?:\d+)([a-z]{2})\2/;
//man7788abab

显然 \2 匹配的是 "ab" 而不是 "7788" 。这样便于分组处理,也加快了查询的效率。

  3、子模式匹配

  有时我们想直接引用操作括号匹配的本文,那么可以用子模式匹配的功能(权威指南里叫子模式匹配,有点别扭,实际就是用一个变量形式替换匹配的文本)。基本形式是用 '$n'的形式替代匹配编号为n的文本,常用在String对象里的replace()方法,见例子,等号两边交换单词:

var reg = /(\w+)=(\w+)/;
var str = ‘love=hate';
str.replace(reg,'$2=$1');
//"hate=love"

次序、贪婪、懒惰:

  一般的重复匹配字符如?、+、*、{n,m}在匹配的过程中,采用贪婪匹配的方法,即尽可能多的匹配到结果字符。与之对应的是懒惰匹配,即尽可能少的匹配结果,使用形式只需在重复匹配字符后加上问号" ? "即可,如??、+?、*?、{n,m}?。见例子:

var str = 'goooogle‘;
var reg1 = /o+/;   //"goooo"
var reg2 = /o+?/;  //"go"

  现在对例子稍加改动:

var str = 'goooogle‘;
var reg1 = /o+gle/;  //"oooogle"
var reg2 = /o+?gle/;  //"oooogle"

  改过后的例子结果变为相同了,为什么 /o+?gle/ 没有匹配到“ogle”呢?原来正则表达式中总是从左往右进行匹配的,不会从右边获取子串进行匹配。

  虽然上面的结果相同,但匹配的原理不太一样。在reg1中,首先o+会匹配所有的"o",然后接着匹配"gle",从而完成整体匹配。而在reg2中,o+?会先匹配一个"o",然后gle在字符串的第2位到第4位(即原串的"ooo")匹配失败。进而回溯至o+?去匹配第二个"o",成功后再在第3位到第4位匹配"gle",以此类推……最后匹配到整个字符串。

  总体要记住,从优先级来说,从左往右的次序匹配 > 贪婪 / 懒惰匹配。

零宽断言:

  关于零宽断言的总体解释可参考博文《正则表达式30分钟入门教程》,值得注意的是,JS里只支持零宽先行断言。即零宽正预测先行断言"(?=exp)"和零宽负预测先行断言“(?!exp)"。
  所谓“零宽”,就是它并不在匹配的结果字符中占据空间。例如“\w","\s"就会占据一个或几个空间,依匹配的字符长度决定。而像”^","$"这种对应的首末位置,不占据空间,零宽就是属于这一类。

  所谓“正 / 负预测”,是指断言中要求满足的情况。“正”表示要满足exp,“负”表示要不满足exp的。

  所谓"先行",是指被匹配的字符串在前面,零宽断言跟在后面。即串的后一部分是否满足断言。

  所谓“断言”,就是判断的条件。

  看两种零宽断言的例子:

var str = 'java coffeescript';
var reg1 = /\b\w+(?=script\b)/; //coffee
var reg2 = /\b\w+(?!script\b)/; //java

  reg1为零宽正预测先行断言,"(?=script\b)"表示某单词需以“script”结尾,它代表着一种条件,不占有任何空间大小。

  同样,reg2为零宽负预测先行断言,"(?!script\b)"表示不以“script”结尾的单词。

  另外,因为没有零宽后顾断言,不能判断某字符串的前面部分满足什么条件。但在JS中可以用多次正则表达式来实现:先匹配到要找的串,然后截取开头到index的字符子串,再匹配子串末尾是否符合需要的断言条件。具体用法可另外尝试一下。

match()与exec()的异同:

  match和exec是正则表达式匹配字符串的常用方法。两者实现的功能差不多,有些细微的区别:

  1、使用方式

  match是字符串包装对象的方法,用法:String.match(RegExp);
  exec是正则表达式对象的方法,用法:RegExp.exec(String);

  2、返回的结果

    当RegExp没有设置全局标志 "g" 时:

      两者的返回结果相同。即无匹配值时返回null,有匹配值时返回一个数组(令array)。array[0]为匹配的字符串,array[1]、array[2]……则对应为正则表达式中圆括号匹配的子字符串$1、$2……。同时数组带有两个属性,array.index表示匹配字符串的初始位置,array.input表示正在检索的字符串。

    当RegExp有设置全局标志 "g" 时:

      match在有值时返回一个数组array。数组的每项依次表示匹配到的所有的字符串,因此不再有圆括号匹配的子字符串了。此时数组没有index属性和input属性。

      exec则与没有全局标示 "g" 的表现无异。此时返回的是数组array,array[0]为当前匹配的字符串,array[1],array[2]……则为当前匹配下的圆括号匹配的字串。此时要注意RegExp对象的lastIndex属性,表示原字符串中匹配的字符串末尾的后一个位置。当没有进一步的匹配结果时,lastIndex属性置0。因此,可用lastIndex的循环找出所有的匹配字符串。来看看例子:

var str = 'I love1 my job22';
var reg = /\b[a-z]+(\d+)\b/g;
array = str.match(reg);
//array = ["love1", "job22"]
//array.index = undefind
//array.input = undefined
------------------------------------
array = reg.exec(str);
//array = ["love1", "1"]
//array.index = 2
//array.input = "I love1 my job22"
//reg.lastIndex = 7
//run again
reg.exec(str);
//array = ["job22", "22"]
//array.index = 11
//array.input = "I love1 my job22"
//reg.lastIndex = 16
//run again
reg.exec(str);
//reg.lastIndex = 0

  最后,考虑到ECMAScript 3 和ECMAScript 5的版本区别,每次匹配完之后记得要手动将RegExp对象的lastIndex属性置0,以满足老非IE浏览器的要求。

js正则表达式,pattern,注意事项

一句话,请使用,/\w+@+\w+(\.+\w+){1,}/.test(str)  来验证,不要用"\w+@+\w+(\.+\w+){1,}".test(str) 来验证;
使用后者,直接,用add@dfddf 就可以通过验证了;

(0)

相关推荐

  • JavaScript中的正则表达式使用及验证qq号码的正则

    废话不多说了,直接给大家贴正则表达式代码了. function myValid() { var errorMsg = ""; var res = true; //拿到要验证的值. var receiveName = $("#receiveName").val();//姓名 var receiveMobile = $("#tMobile").val();//手机号 var validCode = $("#validCode").

  • Javascript基础知识(一)核心基础语法与事件模型

    一.Javascript核心基础语法 1.Javascript是一门增加交互效果的编程语言,它最初由网景公司发明,最后提交给ECMA(欧洲计算机制造商协会),ECMA将Javascript标准化,其命名为Javascript. 2.Javascript是一门解释性语言,无需编译就可以直接在浏览器下运行. 3.Javascript的用途? 1.可以控制网页中所有元素,增加.删除.修改元素的属性. 2.可以在html中放入动态文本. 3.响应用户在使用网页时产生的事件. 4.校验用户输入的数据. 5

  • JavaScript基础语法、dom操作树及document对象

    第一部分 基本语法: 1.数据类型(字符串.小数.整数.布尔.时间日期) 复制代码 代码如下: var s="3.14" var n=parsefloat(s) s+=5; var s="abc3.14" var n=parsefloat(s) //NaN s+=5;//解析转换成小数型 var d=parseInt(s)//解析转换成整数型 isNaN(字符串),判断是不是数字模样的字符串,是-false:否-true 2.变量 3.运算符:四大类 4.表达式(为

  • js正则表达式基本语法(精粹)

    1.正则表达式基本语法 两个特殊的符号'^'和'$'.他们的作用是分别指出一个字符串的开始和结束. 例子如下: "^The":表示所有以"The"开始的字符串("There","The cat"等): "of despair$":表示所以以"of despair"结尾的字符串: "^abc$":表示开始和结尾都是"abc"的字符串--呵呵,只有&q

  • JavaScript正则表达式验证身份证号码是否合法(两种方法)

    第一种方法: 在用户注册页面有些需求要求的比较严格,需要对身份证js验证是否合法,通过此功能严格此系统软件,从而过滤到很多水客.下面就此实现方法给大家讲解下. 很多时候我们都是通过一组正则表达式来判断用户输入的身份证是否合法,那在用正则表达式判断之前,你对身份证号的组成有多少了解呢?下面来说说一个身份证号里面包含了多少的信息: 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码.

  • 使用JavaScript正则表达式如何去掉双引号

    最近接了一个项目,项目需求需要用js正则表达式过滤掉页面文本域中值得双引号,其实解决办法很简单,下面把我写的代码分享给大家,有同样需求的朋友可以参考下. 具体的解决代码如下: <html> <script language="javascript"> //var pattern = /[^"]*/; //校验字符串中是否都是非双引号的字符 var pattern = /["]+/; //校验字符串中是否有双引号的字符 //var patter

  • 详解AngularJS中的表达式使用

    表达式用于应用程序数据绑定到HTML.表达式都写在双括号就像{{表达式}}.表达式中的行为跟ng-bind指令方式相同. AngularJS应用表达式是纯javascript表达式,并输出它们被使用的数据在那里. 使用数字 <p>Expense on Books : {{cost * quantity}} Rs</p> 使用字符串 <p>Hello {{student.firstname + " " + student.lastname}}!<

  • JavaScript学习笔记之基础语法

    JavaScript中很多基础内容和Java中大体上基本一样,所以不需要再单独重复讲了,包括: 各种算术运算符.比较运算符.逻辑运算符: if else语句.switch语句: for循环.while循环.do while循环: 标签.break.continue: try catch throw语句. 可以查看文后的参考链接. 后面的内容都是JavaScript中不同的部分. 本文先说上面内容中的几个细节不同. 1.全等判断 JavaScript的比较运算符中有一个全等判断===,是用来判断值

  • JavaScript基础语法之js表达式

    本文将详细介绍javascript表达式,表达式分为原始表达式和复杂表达式.一般,关于javascript基础语法,人们听得比较多的术语是操作符和语句.但,其实还有一个术语经常使用,却很少被提到,这就是javascript表达式(expression). 原始表达式(primary exression) 原始表达式是表达式的最小单位--它不再包含其他表达式.javascript中的原始表达式包括this关键字.标识符引用.字面量引用.数组初始化.对象初始化和分组表达式 PrimaryExpres

  • JS正则表达式基本用法(经典全)

    //校验是否全由数字组成 funtin isigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.x(s)) rturn fals rturn tru } JavaSript表单验证mail,判断一个输入量是否为邮箱mail,通过正则表达式实现. //检查mail邮箱 funtin ismail(str){        var rg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3})

  • JavaScript高级程序设计(第3版)学习笔记2 js基础语法

    这一篇复习一下ECMAScript规范中的基础语法,英文好的朋友可以直接阅读官方文档.JavaScript本质上也是一种类C语言,熟悉C语言的朋友,可以非常轻松的阅读这篇文章,甚至都可以跳过,不过建议你最好还是看一看,在介绍的同时,我可能会引用一些自认为不易理解且比较流行的用法. 基础语法 1.标识符:所谓标识符,实际上就是指一个满足一定规范,能够被引擎识别的名字,可以用来表示常量.变量.函数名.函数参数.对象.对象属性等所有可命名对象的名称. (1)区分大小写. (2)以字母.下划线(_)或美

  • 日常收集JS邮箱验证正则表达式

    背景:正则是一门厚书啊,想写好也不容易,但日常中也就那些像电话.邮箱.手机,网上一堆,但真好验证好了,还得了解一点正则知识,再就是多测试了:-) 下面邮箱正则: 中划线:中划线域名就是米农口中说的扁担域名了,扁担域名由于输入比较麻烦,看起来也比较不正规,是没有多大的价值,目前投资的人是比较少的.按照DNS的标准,域名是不允许有下划线的. 下划线:一些人在注册用户名的喜欢使用下划线_,这种用户名在登录邮箱时很麻烦,给你发邮件的人也很不方便. 二级域名邮箱基本被消灭,这个哥们的正则可以写下划线,扩大

  • js正则表达式验证大全(收集)

    引用网址  http://hi.baidu.com/quiteuniverse/blog/item/9f3f043d46ad1e07bba16716.html 以下函数调用方式: function check() { var bb = document.getElementById("txt_id").value;//txt_id为文本框的ID alert(ismobile(bb));//ismobile 代表以下任何一个函数名称 } HTML代码:   <input type=

随机推荐