JavaScript RegExp – 正则表达式基础

JavaScript RegExp – 正则表达式基础

JavaScript 中,RegExp 是正则表达式 (Regular Expression) 的缩写,是一种用于匹配字符串中模式的对象。RegExp 对象的构造函数采用两个参数:一个用来存储模式的字符串参数,另一个可选的表示修饰符的字符串参数。

基本语法

利用字面量创建正则表达式

使用正则表达式,我们可以从一个字符串中匹配出需要的内容。在 JavaScript 中,我们可以用以下方式创建一个 RegExp 对象:

// 创建一个匹配所有单词字符的正则表达式
const regex = /\w+/;

在这个例子中,\w 匹配所有的单词字符,加上 + 表示匹配至少出现一次以上。

利用构造函数创建正则表达式

如果我们更喜欢使用构造函数来创建 RegExp 对象,我们需要传入两个参数,第一个参数为存储模式的字符串,第二个参数为表示修饰符的字符串:

const regex = new RegExp('\\w+', 'g');

在这个例子中,\w 匹配所有的单词字符,加上 + 表示匹配至少出现一次以上,g 表示全局匹配。

常用的正则表达式修饰符

i – 不区分大小写匹配

修饰符 i 表示忽略大小写匹配。例如,下列正则表达式可以匹配各种大小写形式的 javascript

const regex = /javascript/i;
console.log(regex.test('JavaScript')); // true
console.log(regex.test('JAVASCRIPT')); // true
console.log(regex.test('javaSCRIPT')); // true
console.log(regex.test('Java Script')); // false

g – 全局匹配

修饰符 g 表示全局匹配。例如,下列正则表达式可以匹配所有 javascript 出现的位置:

const regex = /javascript/g;
console.log('JavaScript是一门非常受欢迎的编程语言,JavaScript在前端开发中被广泛使用。'.match(regex)); // ["JavaScript", "JavaScript"]

m – 多行匹配

修饰符 m 表示多行匹配。例如,下列正则表达式可以匹配一个或多个以 # 开头的行:

const regex = /^#\s*(.+)/gm;
const str = `# JavaScript RegExp
## 基本语法

### 利用字面量创建正则表达式
`;

console.log(str.match(regex)); // ["# JavaScript RegExp", "## 基本语法", "### 利用字面量创建正则表达式"]

常用的正则表达式元字符

. – 匹配任意字符

元字符 . 表示可以匹配任意字符。例如,下列正则表达式可以匹配 catcot,并且也可以匹配 coat

const regex = /c.t/;
console.log(regex.test('cat')); // true
console.log(regex.test('cot')); // true
console.log(regex.test('coat')); // true

[] – 匹配字符组

元字符 [] 表示匹配方括号内任意一个字符。例如,下列正则表达式可以匹配 catcot,但是不能匹配 coat

const regex = /c[ao]t/;
console.log(regex.test('cat')); // true
console.log(regex.test('cot')); // true
console.log(regex.test('coat')); // false

[^] – 排除字符组

在字符组 [] 中,使用修饰符 ^ 表示排除字符组中的任何一个字符。例如,下列正则表达式可以匹配不是元音字母的任何字符:

const regex = /[^aeiou]/;
console.log(regex.test('c')); // true
console.log(regex.test('o')); // false

– – 匹配字符范围

在字符组 [] 中,使用 - 表示匹配字符范围内的任意一个字符。例如,下列正则表达式可以匹配 0~9 的任意数字字符:

const regex = /[0-9]/;
console.log(regex.test('0123456789')); // true

\d – 匹配数字字符

元字符 \d 表示匹配数字字符。例如,下列正则表达式可以匹配 0~9 的任意数字字符:

const regex = /\d/;
console.log(regex.test('0123456789')); // true

\D – 匹配非数字字符

元字符 \D 表示匹配非数字字符。例如,下列正则表达式可以匹配非数字字符:

const regex = /\D/;
console.log(regex.test('abc')); // true

\s – 匹配空白字符

元字符 \s 表示匹配空格、制表符、回车符等空白字符。例如,下列正则表达式可以匹配空白字符:

const regex = /\s/;
console.log(regex.test(' ')); // true
console.log(regex.test('\t')); // true
console.log(regex.test('\n')); // true

\S – 匹配非空白字符

元字符 \S 表示匹配非空格、制表符、回车符等非空白字符。例如,下列正则表达式可以匹配非空白字符:

const regex = /\S/;
console.log(regex.test('abc')); // true
console.log(regex.test(' ')); // false

\w – 匹配单词字符

元字符 \w 表示匹配单词字符。例如,下列正则表达式可以匹配所有单词字符(包括数字):

const regex = /\w/;
console.log(regex.test('abc')); // true
console.log(regex.test('0123456789')); // true
console.log(regex.test('$')); // false

\W – 匹配非单词字符

元字符 \W 表示匹配非单词字符。例如,下列正则表达式可以匹配非单词字符(不包括数字和字母):

const regex = /\W/;
console.log(regex.test(' ')); // true
console.log(regex.test('$')); // true
console.log(regex.test('a')); // false

^ – 匹配字符串开头

元字符 ^ 表示匹配字符串的开头。例如,下列正则表达式可以匹配以 http 开头的字符串:

const regex = /^http/;
console.log(regex.test('http://www.baidu.com')); // true
console.log(regex.test('https://www.baidu.com')); // false

$ – 匹配字符串结尾

元字符 $ 表示匹配字符串的结尾。例如,下列正则表达式可以匹配以 .com 结尾的字符串:

const regex = /\.com$/;
console.log(regex.test('http://www.baidu.com')); // true
console.log(regex.test('https://www.baidu.com')); // true

* – 匹配前面的子表达式零次或多次

元字符 * 表示匹配前面的子表达式零次或多次。例如,下列正则表达式可以匹配含有零个或多个字母 a 的字符串:

const regex = /a*/;
console.log(regex.test('')); // true
console.log(regex.test('a')); // true
console.log(regex.test('aaaa')); // true
console.log(regex.test('bc')); // false

+ – 匹配前面的子表达式一次或多次

元字符 + 表示匹配前面的子表达式一次或多次。例如,下列正则表达式可以匹配含有一个或多个字母 a 的字符串:

const regex = /a+/;
console.log(regex.test('a')); // true
console.log(regex.test('aaaa')); // true
console.log(regex.test('')); // false
console.log(regex.test('bc')); // false

? – 匹配前面的子表达式零次或一次

元字符 ? 表示匹配前面的子表达式零次或一次。例如,下列正则表达式可以匹配含有零个或一个字母 a 的字符串:

const regex = /a?/;
console.log(regex.test('a')); // true
console.log(regex.test('')); // true
console.log(regex.test('b')); // false

{} – 匹配前面的子表达式出现次数

元字符 {} 表示匹配前面的子表达式出现的次数。例如,下列正则表达式可以匹配含有 3 个连续的 a 的字符串:

const regex = /a{3}/;
console.log(regex.test('aaabbb')); // true
console.log(regex.test('aaa')); // true
console.log(regex.test('baaa')); // false

也可以匹配前面的子表达式出现一次或多次:

const regex = /a{1,}/;
console.log(regex.test('aaa')); // true
console.log(regex.test('')); // false

常用的正则表达式方法

字符串的 search 方法

字符串的 search 方法可以搜索字符串中是否存在符合正则表达式的子串,并返回子串的首字符位置。

const str = 'Hello, world!';
console.log(str.search(/world/)); // 7
console.log(str.search(/javascript/)); // -1

字符串的 replace 方法

字符串的 replace 方法可以将符合正则表达式模式的子串替换掉。

const str = 'Hello, world!';
console.log(str.replace(/world/, 'JavaScript')); // 'Hello, JavaScript!'
console.log(str.replace(/Javascript/, 'JavaScript')); // 'Hello, world!'

在替换字符串中,还可以使用 $1$2 等变量来引用正则表达式的分组结果。

const str = 'Name: John Doe';
console.log(str.replace(/Name: (.*)/, 'Name: $1 Smith')); // 'Name: John Doe Smith'

正则表达式的 test 方法

正则表达式的 test 方法可以测试一个字符串是否符合它的模式。

const regex = /javascript/i;
console.log(regex.test('JavaScript is awesome!')); // true
console.log(regex.test('Ruby on Rails is great!')); // false

正则表达式的 exec 方法

正则表达式的 exec 方法可以匹配一个字符串,并返回匹配的结果。它与 match 方法的不同在于,exec 方法不会将正则表达式保存在原始字符串的属性中。

const regex = /javascript/;
console.log(regex.exec('JavaScript is awesome!')); // ['JavaScript', index: 0, input: 'JavaScript is awesome!', groups: undefined]
console.log(regex.exec('Ruby on Rails is great!')); // null

结论

在本篇文章中,我们了解了 JavaScript 中 RegExp 对象的基本语法、常用正则表达式的修饰符和元字符,以及常用的正则表达式方法。正则表达式在前端开发中具有广泛的应用,例如表单验证、字符串处理等场景。希望这篇文章能够帮助大家对 JavaScript 中的正则表达式有更深入的理解。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程