JavaScript:RegExp类型

JavaScript通过RegExp类型来支持正则表达式。语法:

var exepression = /pattern/flags;

其中,pattern可以任意的正则表达式,可以包含字符类限定符分组向前查找以及反向引用。每一个正则表达式都可带一个或多个标志,用于标明正则表达式的行为。

  • g:表示全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止
  • i:表示不区分大小写模式,即在匹配项时忽略模式与字符串的大小写
  • m:表示多行模式,即到达一行文本末尾时还会继续查找下一行是否存在匹配项

举例:

// 匹配字符串中所有“at”的实例
var pattern1 = /at/g;

// 匹配第一个“bat”或“cat”,不区分大小写
var pattern2 = /[bc]at/i;

// 匹配所有以“at”结尾的3个字符的组合,不区分大小写
var pattern3 = /.at/gi;

上面的例子中用到的“[”、“]”、“.”是元字符(类似于编程语言的保留字,使用的时候需要进行转义)。

// 匹配第一个“[bc]at”,不区分大小写
var pattern2 = /\[bc\]at/i;

// 匹配所有“.at”,不区分大小写
var pattern4 = /\.at/gi;

另一种创建正则表达式的方式是构造函数:

var exepression = new RegExp("pattern", "flags");

构造函数的第一个参数是字符串形式的模式,在默写情况下需要对字符进行双重转义。所有元字符都必须双重转义,已经转义过的字符也是如此,例如,\n(字符\在字符串中通常被转义为\,而在正则表达式字符串中就会变成\\)。

使用正则表达式字面量和使用RegExp构造函数创建的正则表达式不一样。

var re = null,
    i;
for (i = 0;i < 10; i++) {
    re = /cat/g;
    re.test("catastrophe");
}

for (i = 0; i < 10; i++) {
    re = new RegExp("cat", "g");
    re.test("catastrophe");
}

在第一个循环中,只为/cat/创建了一个RegExp实例,由于实例属性不会重置,所以在循环中再次调用test()会失败,因为第二次调用时从索引为3的字符("cat"后面的“a”)开始。

第二个循环使用RegExp构造函数,在每次循环中都会创建正则表达式。因此每次迭代都会创建一个新的RegExp实例,所以每次调用test()都会返回true。

实例属性

RegExp的每个实例都具有下列属性,通过这些属性可以获取模式的各种信息。

  • global:布尔值,表示是否设置了g标志。
  • ignoreCase:布尔值,表示是否设置了i标志
  • lastIndex:整数,表示开始搜索下一个匹配项的字符起始位置,从0开始
  • multiline:布尔值,表示是否设置了m标志
  • source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回
    var pattern = /[bc]at/i;
    alert(pattern.global); // false
    alert(pattern.ignoreCase); // true
    alert(pattern.multiline); // false
    alert(pattern.lastIndex); // 0
    alert(pattern.source); // "/[bc]at"

实例方法

exec()方法

exec()接收一个参数,即要应用模式的的字符串,返回包含第一个匹配项信息的数组,如果没有匹配项就返回null。返回的数组虽然是Array的实例,但是包含两个额外的属性:

  • index:表示匹配项在字符串中的位置
  • input:表示应用正则表达式的字符串

在数组中,第一项是与整合模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组值包含一项。)

var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;

var matchers = pattern.exec(text);
alert(matchers.index);
alert(matchers.index);  // "mom and dad and baby"
alert(matchers[0]);     // "mom and dad and baby"
alert(matchers[1]);     // " and dad and baby"
alert(matchers[2]);     // " and baby"

对于exec()方法而言,即使在模式中设置了全局标志,它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终匹配第一个匹配项的信息。而在设置全局标志的情况下,每次调用exec()都会在字符串中继续查找新匹配项:

var text = "cat, bat, sat, fat";
var pattern1 = /.at/;

var matches = pattern1.exec(text);
alert(matches.index);   // 0
alert(matches[0]);      // cat
alert(pattern1.lastIndex); // 0

matches = pattern1.exec(text);
alert(matches.index);   // 0
alert(matches[0]);      // cat
alert(pattern1.lastIndex);   // 0

var pattern2 = /.at/g;

var matches = pattern2.exec(text);
alert(matches.index);   // 0
alert(matches[0]);      // cat
alert(pattern2.lastIndex);  // 3

matches = pattern2.exec(text);
alert(matches.index);   // 5
alert(matches[0]);      // bat
alert(pattern2.lastIndex);  // 8

在第一个非全局模式下,每次返回第一个匹配项;而在第二个全局模式下,每次返回字符串中的下一个匹配项。在全局模式下,lastIndex的值在每次调用exec()后都会增加,而在全局模式下则不会变。

test()方法

test()方法接收一个字符串参数。在模式与参数匹配的情况下返回true;否则,返回false。

var text = "000-00-000";
var pattern = /\d{3}-\d{2}-\d{3}/;

if (pattern.test(text)) {
    alert("匹配成功");
}

RegExp实例继承的toLocaleString()和toString()方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。

var pattern = new RegExp("\\[bc\\]at", "gi");
alert(pattern.toString());          // /\[bc\]at/gi
alert(pattern.toLocaleString());    // /\[bc\]at/gi

RegExp构造函数属性

RegExp构造函数包含一些属性(Opera不支持),这些属性可以作用于作用域中的所有正则表达式,这些属性分别有长属性名和短属性名两种访问方式。

长属性名 短属性名 说明
input $_ 最近一次要匹配的字符串
lastMatch $& 最近一次的匹配项
lastParent $+ 最近一次的捕获组
rightContext $* 最近一次的捕获组
rightContext $‘ Input字符串中lastMatch之后的文本

使用这些属性可以从exec()或test()执行的操作中提取更具体的信息。下面通过长属性名访问:

var text = "what are you doing now";
var pattern = /(.)ng/g;

if (pattern.test(text)) {
    alert(RegExp.input);        // what are you doing now
    alert(RegExp.leftContext);  // what are you do
    alert(RegExp.rightContext); // now
    alert(RegExp.lastMatch);    // ing
    alert(RegExp.lastParen);    // i
    alert(pattern.multiline);   // false
}

下面通过短属性名访问:

var text = "what are you doing now";
var pattern = /(.)ng/g;

if (pattern.test(text)) {
    alert(RegExp.$_);        // what are you doing now
    alert(RegExp["$`"]);  // what are you do
    alert(RegExp["$‘"]); // now
    alert(RegExp["$&"]);    // ing
    alert(RegExp["$+"]);    // i
}

除了上面的属性外,还有9个用于存储捕获组的构造函数属性:RegExp.$1...RegExp.$9,分别存储第一...第九个匹配的捕获组。

var text = "what are you doing now";
var pattern = /(..)in(.)/g;

if (pattern.test(text)) {
    alert(RegExp.$1);   // do
    alert(RegExp.$2);   // g
}

模式的局限性

JavaScript正则表达式不支持的特性:

  • 匹配字符串开始和结尾的\A和\Z锚
  • 向后查找
  • 并集和交集类
  • 原子组
  • Unicode支持
  • 命名的捕获组
  • s(single,单行)和x(free-spacing,无间隔)匹配模式
  • 条件匹配
  • 正则表达式注释
时间: 2024-10-12 19:00:25

JavaScript:RegExp类型的相关文章

高程5.4 RegExp类型

ECMAScript通过RegExp类型来支持正则表达式. 使用下面类似Perl的语法,就可以创建一个正则表达式. var expression=/pattern/flags; 其中的模式(pattern)部分可以是任何简单的或复杂的正则表达式,可以包含字符类,限定符,分组,向前查找以及反向引用. 每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为. 正则表达式的匹配模式支持下面3个标志. g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配

引用类型-RegExp类型

JavaScript高级程序设计(第三版)笔记-第五章-RegExp类型 定义正则表达式有两种方式 1.用字面量形式定义正则表达式: ver expression = /patterns/flags; patterns:可以是任何简单或者复杂的正则表达式 flags: g:表示全局 i:表示不区分大小写 m:表示多行模式,在到达一行的末尾时还会继续查找下一行 var patterns1 = /at/g;//匹配字符中所有“at”的实例 var patterns2 = /[bc]at/i;//匹配

JavaScript 的类型

JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. javascript 存在2套类型系统,一套是元类型,用typeof可以检验,有六种:"number"."string"."boolean"."object"."function"."undefined". 另一套是对象类型系统,是元类型object的一个分支.

JavaScript中类型检测

JavaScript是类型松散的,也就是说,在使用变量和函数参数之前,不会对它们进行比较已确保它们的数据类型正确. JS有五种基本数据类型:Undefined.Null.Boolean.Number和String,还有一种复杂数据类型Object. JS是不支持任何创建自定义类型的机制,所有值最终都将是上述6种数据类型之一. 对于上述6种类型的变量,可以利用typeof操作符来检测. typeof操作符可能返回下列六个字符串: "undefined"--这个值未定义,对应Undefin

javascript ECMAScript类型判断

JS中的变量是松散类型(即弱类型)的,可以用来保存任何类型的数据. typeof   一元操作  判断是原生类型还是对象类型时候用 typeof 可以用来检测给定变量的数据类型,可能的返回值: 1. 'undefined' --- 这个值未定义: 2. 'boolean'    --- 这个值是布尔值: 3. 'string'        --- 这个值是字符串: 4. 'number'     --- 这个值是数值: 5. 'object'       --- 这个值是对象或null: 6.

RegExp类型,单体内置对象

1.RegExp类型:  1)什么是正则表达式:RegExp    --是一种规则,模式    --强大的字符串匹配工具    --创建:    --使用RegExp构造函数创建:var re=new RegExp('a','i');    --使用字面量创建:var re=/a/i;    //i--ignore表示忽略大小写 2)正则表达式里面的字符:    1)修饰符      --i:执行对大小写不敏感的匹配.      --g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)  

正则表达式学习-JavaScript RegExp 对象

W3School 中有关于正则表达式的全面介绍:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp 1.什么是正则表达式?正则表达式有什么用? 知道正则表达式有什么用,是学习它的最好动力. 正则表达式跟平时用的字符串操作功能函数类似.功能比它强大很多. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过

JavaScript的类型自动转换高级玩法JSFuck

0 前言 最开始是不小心在微信公众号(程序员大咖)看到一篇JS的高逼格代码,然后通过里面的链接跳转到了JSFuck的wiki,就像顺着迷宫找宝藏的感觉,感叹JS的自动类型转换的牛逼. 1 样例 (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]] //如何装逼用代码骂别人SB (([][[]]+[])[+!![]]+([]+{})[!+[]+!![]])//如何用代码优雅地证明自己NB 2 原理 1.对于非原

JavaScript事件类型

JavaScript事件类型 Web浏览器中可能发生的事件有很多类型.这里我将主要将下面几种常用的事件类型: UI事件 焦点事件 鼠标与滚轮事件 键盘与文本事件 复合事件 变动事件 HTML5事件 设备事件 触摸与手势事件 第一部分:UI事件 UI事件中UI即(User Interface,用户界面),当用户与页面桑拿的元素交互时触发. UI事件中主要包括load,unload,abort,error,select,resize,scroll事件. 1.load事件 此事件为当页面完全加载完之后