📅  最后修改于: 2023-12-03 15:10:12.008000             🧑  作者: Mango
在编写前端页面或者服务端脚本时,我们常常需要对字符串进行搜索和匹配操作。这时,搜索类正则表达式就是一个非常有用的工具。
在 JavaScript 中,可以使用 RegExp
对象来创建正则表达式,然后使用它的方法对字符串进行操作。本文将介绍常用的搜索类正则表达式及它们的用法。
正则表达式是一种用来描述字符模式的语言,它可以用来匹配字符串中的某些特征。下面是一些常用的正则表达式符号:
| 符号 | 含义 | 示例 |
| ---- | ---- | ---- |
| .
| 匹配除了换行符以外的任意一个字符 | a.b
匹配 a*b
、a#b
等 |
| *
| 匹配前面的字符零次或多次 | a*b
匹配 b
、ab
、aab
、aaab
等 |
| +
| 匹配前面的字符一次或多次 | a+b
匹配 ab
、aab
、aaab
等,但不匹配 b
|
| ?
| 匹配前面的字符零次或一次 | a?b
匹配 b
、ab
等 |
| |
| 匹配两边任意一个表达式 | a|b
匹配 a
、b
|
| ^
| 匹配字符串的开头 | ^a
匹配以 a
开头的字符串 |
| $
| 匹配字符串的结尾 | a$
匹配以 a
结尾的字符串 |
最简单的正则表达式就是只包含普通字符的表达式。例如,我们要在一个字符串中匹配 hello
,可以使用以下代码:
const str = 'hello world';
const regex = /hello/;
console.log(regex.test(str)); // true
上述代码中,/hello/
就是一个正则表达式。test()
方法用来测试一个字符串是否匹配该正则表达式,返回一个布尔值。
元字符类是一种用来匹配字符集合的正则表达式构造。例如,我们要匹配字符串中的所有数字,可以使用以下代码:
const str = '123abc456';
const regex = /\d+/;
const match = str.match(regex);
console.log(match); // ["123", index: 0, input: "123abc456", groups: undefined]
上述代码中,\d
表示匹配所有数字,+
表示匹配一次或多次。match()
方法用来搜索字符串中符合正则表达式的第一个字符串,返回一个数组。
常用的元字符如下:
| 符号 | 含义 | 示例 |
| ---- | ---- | ---- |
| \d
| 匹配任意数字字符 | \d+
匹配 123
、45678
等 |
| \w
| 匹配任意字母、数字、下划线 | \w+
匹配 hello_world_123
等 |
| \s
| 匹配任意空白字符 | a\sb
匹配 a b
、a b
等 |
| .
| 匹配除换行符以外的任意字符 | a.b
匹配 a&b
、a*b
等 |
定位符是用来匹配字符串中特定位置的元字符。例如,我们要匹配字符串中的所有以 #
开头的单词,可以使用以下代码:
const str = '#hello #world #123';
const regex = /#\w+/g;
const match = str.match(regex);
console.log(match); // ["#hello", "#world", "#123"]
上述代码中,/\w+/
匹配任意一个字母、数字、下划线,/#[a-zA-Z_]+/
匹配以 #
开头的单词。g
表示全局匹配。我们可以使用 +
或 *
来匹配定位符之前的字符。
常用的定位符如下:
| 符号 | 含义 |
| ---- | ---- |
| ^
| 匹配开头 |
| $
| 匹配结尾 |
| \b
| 匹配单词边界 |
| \B
| 匹配非单词边界 |
默认情况下,正则表达式是贪婪匹配的。也就是说,它会尽可能地匹配字符串中的最长匹配。例如,我们要匹配字符串中的所有段落,可以使用以下代码:
const str = 'paragraph1\n\nparagraph2\n\nparagraph3';
const regex = /.*\n\n/g;
const match = str.match(regex);
console.log(match); // ["paragraph1\n\nparagraph2\n\n"]
上述代码中,.*
匹配任意字符,/.*\n\n/g
表示匹配任意一个段落。因为正则表达式是贪婪匹配的,所以它会匹配到字符串的最后一个段落。
为了解决贪婪匹配的问题,可以使用 ?
符号来表示非贪婪匹配。例如,我们要匹配字符串中的所有段落,可以使用以下代码:
const str = 'paragraph1\n\nparagraph2\n\nparagraph3';
const regex = /.*?\n\n/g;
const match = str.match(regex);
console.log(match); // ["paragraph1\n\n", "paragraph2\n\n", "paragraph3"]
上述代码中,.*?
表示非贪婪匹配,它会尽可能地匹配字符串中的最短匹配。所以,它会匹配到字符串中的所有段落。
搜索类正则表达式是编写前端页面或服务端脚本必不可少的工具之一。本文介绍了常用的正则表达式符号、元字符类、定位符、贪婪与非贪婪匹配等内容。希望读者能够通过本文的介绍,对正则表达式有更深入的理解。