首页 > 编程笔记 > JavaScript笔记 > JS正则表达式 阅读:522

在JS中使用正则表达式(2种方式)

JavaScript 中有两种方式使用正则表达式。

构造正则表达式

使用 RegExp 构造函数可以定义正则表达式对象,具体语句格式如下:

new RegExp(pattern, attributes);

参数 pattern 是一个字符串,指定匹配模式或者正则表达式对象。参数 attributes 是一个可选的修饰性标志,包含 "g" "i" 和 "m" 三个选项,分别设置全局匹配、区分大小写的匹配和多行匹配;如果参数 pattern 是正则表达式对象,则必须省略该参数。

该函数返回一个新的 RegExp 对象,该对象包含指定的匹配模式和匹配标志。

示例1

下面示例使用 RegExp 构造函数定义了一个简单的正则表达式,匹配模式为字符“a”,没有设置第二个参数,所以这个正则表达式只能匹配字符串中第一个小写字母“a”,后面的字母“a”将无法被匹配到。
var r = new RegExp("a");   //构造最简单的正则表达式
var s = "JavaScript != JAVA";  //定义字符串直接量
var a = s.match(r);  //调用正则表达式执行匹配操作,返回匹配的数组
console.log(a);  //返回数组["a"]
console.log(a.index);  //返回值为1,匹配的下标位置

示例2

如果希望匹配字符串中所有的字母 a,且不区分大小写,则可以在第 2 个参数中设置 g 和 i 修饰词。
var r = new RegExp("a", "gi");  //设置匹配模式为全局匹配,且不区分大小写
var s = "JavaScript != JAVA";  //字符串直接量
var a = s.match(r);  //匹配查找
console.log(a);  //返回数组["a", "a", "A", "A"]

示例3

在正则表达式中可以使用特殊字符。下面示例的正则表达式将匹配字符串“JavaScript JAVA”中每个单词的首字母。
var r = new RegExp("\\b\\w", "gi");  //构造正则表达式对象
var s = "JavaScript JAVA";  //字符串直接量
var a = s.match(r);  //匹配查找
console.log(A);  //返回数组["j", "J"]
在上面示例中,字符串 "\\b\\w" 表示一个匹配模式,其中 “\b" 表示单词的边界,"\w" 表示任意 ASCII 字符,反斜杠表示转义序列。为了避免 Regular() 构造函数的误解,必须使用“\\”替换所有“\”字符,使用双反斜杠表示斜杠本身的意思。

在脚本中动态创建正则表达式时,使用构造函数 RegExp() 会更方便。例如,如果检索的字符串是由用户输入的,那么就必须在运行时使用 RegExp() 构造函数来创建正则表达式,而不能使用其他方法。

示例4

如果 RegExp() 构造函数的第 1 个参数是一个正则表达式,则第 2 个参数可以省略。这时 RegExp() 构造函数将创建一个参数相同的正则表达式对象。
var r = new RegExp("\\b\\w", "gi");  //构造正则表达式
var r1 = new RegExp(r);  //把正则表达式传递给RegExp()构造函数
var s = "JavaScript JAVA";  //字符串直接量
var a = s.match(r);  //匹配查找
console.log(a);  //返回数组["j", "J"]
把正则表达式直接量传递给 RegExp() 构造函数,可以进行类型封装。

示例5

RegExp() 也可以作为普通函数使用,这时与使用 new 运算符调用构造函数功能相同。不过如果函数的参数是正则表达式,那么它仅返回正则表达式,而不再创建一个新的 RegExp() 对象。
var a = new RegExp("\\b\\w", "gi");  //构造正则表达式对象
var b = new RegExp(a);  //对正则表达式对象进行再封装
var c = RegExp(a);  //返回正则表达式直接量
console.log(a.constructor == RegExp);  //返回true
console.log(b.constructor == RegExp);  //返回true
console.log(c.constructor == RegExp);  //返回true

正则表达式直接量

正则表达式直接量使用双斜杠作为分隔符进行定义,双斜杠之间包含的字符为正则表达式的字符模式,字符模式不能使用引号,标志字符放在最后一个斜杠的后面。语法如下:

/pattern/attributes

示例6

下面示例定义一个正则表达式直接量,然后进行调用。
var r = /\b\w/gi;
var s = "JavaScript JAVA";
var a = s,match(r);  //直接调用正则表达式直接量
console.log(a);  //返回数组["j", "J"]

在 RegExp() 构造函数与正则表达式直接量语法中,匹配模式的表示是不同的。对于 RegExp() 构造函数来说,它接收的是字符串,而不是正则表达式的匹配模式。所以,在上面示例中,RegExp() 构造函数中第 1 个参数里的特殊字符,必须使用双反斜杠来表示,以防止字符串中的字符被 RegExp() 构造函数转义。同时对于第 2 个参数中的修饰符词也应该使用引号来包含。而在正则表达式直接量中每个字符都按正则表达式来定义,普通字符与特殊字符都会被正确解释。

示例7

在 RegExp() 构造函数中可以传递变量,而在正则表达式直接量中是不允许的。
var r = new RegExp("a" + s + "b", "g");  //动态创建正则表达式
var r = /"a" + s + "b"/g;  //错误的用法
在上面示例中,对于正则表达式直接量来说,“"”和“+”都将被视为普通字符进行匹配,而不是作为字符与变量的语法标识符进行连接操作。

JavaScript 正则表达式支持 "g" "i" 和 "m" 三个标志修饰符,简单说明如下。 这三个修饰词分别指定了匹配操作的范围、大小写和多行行为,关键词可以自由组合。

编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员!

编程帮二维码
微信扫描二维码关注

所有教程

优秀文章