天天看点

js 正则表达式对象 RegExp

语法

var patt=new RegExp(pattern,modifiers);
//或更简单的方法
var patt=/pattern/modifiers;//用/~~~~/来表示表达式
           
  • 模式描述了一个表达式模型。
  • js中的正则表达式是放在/~~~/里面的
  • 修饰符(modifiers)描述了检索是否是全局,区分大小写等。

i - 修饰符是用来执行不区分大小写的匹配。 g - 修饰符是用于执行全文的搜索(而不是在找到第一个就停止查找,而是找到所有的匹配)。 注意:当使用构造函数创造正则对象时,需要常规的字符转义规则( 在前面加反斜杠 \)。比如,以下是等价的:

var re = new RegExp("\\w+");
var re = /\w+/;
           

str.match(patt);

var str = "Visit RUnoob";
var patt1 = /runoob/i;
document.write(str.match(patt1));//返会RUnoob
           
  • 如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。 返回和

    RegExp.exec(str)

    相同的结果。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是符合整个正则表达式的首个匹配到的子字符串,而其余的元素存放的是与正则表达式的(用括号括起来的)子表达式匹配的字符串文本(体现是字符串的分组情况)。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。
  • 如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。
var str1 = "acfbrt 1 b 2 c";
var patt1 = /([a-zA-Z]+)b/;
console.log(str1.match(patt1));
// 返回["acfb", "acf"]

var str2 = "visit my blog at http://www.example.com";
var patt2 = /(\w+):\/\/([\w.]+)/;
console.log(str2.match(patt2));
//返回["http://www.example.com", "http", "www.example.com"]
// 正则表达式匹配的结果为:http://www.example.com
// 第一个子表达式 (\w+)匹配结果:http
// 第二个子表达式 ([\w.]+)匹配结果: www.example.com

var str3 = "For more information, see Chapter 3.4.5.1";
var patt3 = /(chapter \d+(\.\d)*)/i;
console.log(str3.match(patt3));
// 返回["Chapter 3.4.5.1", "Chapter 3.4.5.1", ".1"]
// "Chapter 3.4.5.1" is the first match and the first value
//  remembered from (Chapter \d+(\.\d)*)
// ".1" is the last value remembered from (\.\d).

//如果子表达式有*+?这种,如patt2和patt1,则返回最大匹配的子串;
//如果子表达式外面有*+?这种,如patt3,则返回最后一个匹配的子串;
//如果patt1=/([a-zA-Z])+b/;则返回["acfb", "f"]
//如果patt2 = /(\w)+:\/\/([\w.])+/;则返回var patt2 = /(\w)+:\/\/([\w.])+/
           

在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需要这些全局检索的信息,可以使用 RegExp.exec()。

test(str) patt.test(str): test()方法搜索字符串指定的值,根据结果并返回真或假。

var patt1=new RegExp("e"); document.write(patt1.test("The best things in life are free"));//返回true
           
  • 在创建正则表达式对象时如果使用了“g”标识符或者设置它了的global属性值为ture时,那么新创建的正则表达式对象将使用模式对要将要匹配的字符串进行全局匹配。在全局匹配模式下可以对指定要查找的字符串执行多次匹配。每次匹配使用当前正则对象的lastIndex属性的值作为在目标字符串中开始查找的起始位置。lastIndex属性的初始值为0,找到匹配的项后lastIndex的值被重置为匹配内容的下一个字符在字符串中的位置索引,用来标识下次执行匹配时开始查找的位置。如果找不到匹配的项lastIndex的值会被设置为0。
  • 当没有设置正则对象的全局匹配标志时  lastIndex属性的值始终为0,每次执行匹配仅查找字符串中第一个匹配的项。可以通下面的代码来查看在执行匹配相应的lastIndex 属性的值。
var str = "123#abc";
var re = /abc/ig;
console.log(re.test(str)); //输出ture
console.log(re.lastIndex); //输出7
console.log(re.test(str)); //输出false
console.log(re.lastIndex); //输出0
console.log(re.test(str)); //输出ture
console.log(re.lastIndex); //输出7
console.log(re.test(str)); //输出false
console.log(re.lastIndex); //输出0
           

exec(str) exec(str) 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。

var patt1=new RegExp("e"); document.write(patt1.exec("The best things in life are free"));//返回e
           

继续阅读