零、简介
正则表达式,常常缩写为 “regex” 或 “regexp”,是帮助程序员匹配、搜索和替换文本的模式。正则表达式非常强大,但可能难以阅读,因为它们使用特殊字符来做更复杂更灵活的匹配。
一、方法
①test方法
test方法用于检测一个字符串是否匹配某个正则表达式模式。如果字符串 str 中包含与正则表达式 regexObj 匹配的文本,则返回 true;否则返回 false。
regex.test(str);
regex:一个正则表达式对象,它定义了要匹配的模式。可以使用正则表达式字面量或 RegExp 构造函数来创建。
str:要进行检测的字符串。
如果需要匹配多个字符串,只需在正则表达式里用|分隔,即:
const regex = /pattern1|pattern2|...|patternN/;
如果需要不区分大小写进行匹配,需要在正则表达式后添加i修饰符,即:
const regex = /pattern/i;
②match方法
match方法用于在字符串中查找匹配正则表达式的内容。
str.match(regexp);
如果需要让正则表达式在目标字符串中进行全局搜索,找到所有匹配的结果,而不是在找到第一个匹配项后就停止搜索,可以使用全局搜索标志g修饰符来遍历整个字符串,找出所有符合模式的部分。即:
const regex = /pattern/g;
我们之前学过i修饰符,如果想添加多个标志,可以让修饰符组合使用,即:
const regex = /pattern/gi;
③通配符应用
通配符是一种在文本处理、文件搜索、正则表达式等场景中广泛使用的特殊字符,它可以代表一个或多个其他字符,从而实现更灵活的匹配。
1. 点号
有时不知道匹配模式中的确切字符。 如果要精确匹配到完整的单词,那出现一个拼写错误就会匹配不到。 幸运的是,可以使用通配符 . 来处理这种情况。
点号匹配除换行符之外的任意单个字符。比如
const regex = /h.t/;
console.log(regex.test('hat')); // true
console.log(regex.test('hot')); // true
console.log(regex.test('h t')); // true
2.方括号
在精准匹配和匹配所有的两个极端下,方括号是平衡选项,通过定义字符类,它能让你匹配方括号内指定的任意一个字符。比如:
const regex = /[abc]/;
console.log(regex.test('a')); // true
console.log(regex.test('b')); // true
console.log(regex.test('c')); // true
console.log(regex.test('d')); // false
3.连字号
有时需要匹配大量字符,连字符处于方括号内部时,可用于定义连续的字符范围。比如,[a-z] 代表任意小写字母,[A-Z] 代表任意大写字母,[0-9] 代表任意数字,[a-zA-Z0-9] 能够匹配任意字母(大写或小写)以及数字,[ - ~] 可匹配 ASCII 码表中从空格(十进制 32)到波浪号(十进制 126)之间的任意字符。
4.脱字符
当脱字符(^)位于方括号([])内的开头位置时,它用于创建一个排除字符类。这意味着正则表达式会匹配除了方括号内指定字符之外的任意字符。比如:
// 匹配除数字 0 - 9 之外的任意字符
const nonDigitRegex = /[^0-9]/;
console.log(nonDigitRegex.test('a')); // true
console.log(nonDigitRegex.test('5')); // false
同理还可以匹配字符串开头:
// 匹配以 "hello" 开头的字符串
const regex = /^hello/;
const str1 = "hello world";
const str2 = "say hello";
console.log(regex.test(str1)); // true
console.log(regex.test(str2)); // false
5.加号
有时,需要匹配出现一次或者连续多次的的字符(或字符组)。 这意味着它至少出现一次,并且可能重复出现。正则表达式中,+ 紧跟在需要重复匹配的元素之后,表示该元素至少出现一次,没有上限。比如:
// 匹配一个或多个连续的 'a'
const regex = /a+/;
console.log(regex.test('a')); // true
console.log(regex.test('aa')); // true
console.log(regex.test('b')); // false
6.星号
和加号相反,星号用来指定前面的元素可以出现零次或多次。正则表达式中,星号紧跟在需要匹配的元素之后,比如:
// 匹配零个或多个连续的 'a'
const regex = /a*/;
console.log(regex.test('')); // true
console.log(regex.test('a')); // true
console.log(regex.test('aa')); // true
console.log(regex.test('b')); // true
7.惰性匹配
在正则表达式中,贪婪(greedy)匹配会匹配到符合正则表达式匹配模式的字符串的最长可能部分,并将其作为匹配项返回。 另一种方案称为懒惰(lazy)匹配,它会匹配到满足正则表达式的字符串的最小可能部分。在正则表达式中,量词(像 *、+这类符号)默认采用贪婪匹配策略。这意味着它们会尽可能多地匹配满足条件的字符,直至无法再匹配为止。而惰性匹配则恰恰相反,它会尽可能少地匹配字符,一旦找到第一个符合条件的匹配结果就会停止。
要实现惰性匹配,只需在量词后面加上问号(?)即可。
8.美元符号
我们知道脱字符^可以用来匹配字符串开头,如果想要匹配字符串结尾,可以使用正则表达式的美元符号 $ 来搜寻字符串的结尾。当美元符号($)出现在正则表达式的末尾时,它表示匹配必须在字符串的结尾处发生。也就是说,正则表达式所定义的模式要一直匹配到字符串的最后一个字符才算匹配成功。比如:
// 匹配以 "world" 结尾的字符串
const regex = /world$/;
const str1 = "hello world";
const str2 = "hello world!";
console.log(regex.test(str1)); // true
console.log(regex.test(str2)); // false
9.\w和\W
我们在连字号那里提及过[a-zA-Z0-9] 能够匹配任意字母(大写或小写)以及数字,而短语元字符\w等同于[A-Za-z0-9_]。 此字符类匹配大写字母和小写字母以及数字。 注意,这个字符类也包含下划线字符 (_)。
与 \w 相反,\W 是匹配非单词字符的元字符,也就是除了字母、数字和下划线之外的任何字符。它是 [^a-zA-Z0-9_] 的缩写。
10.\d和\D
同样地,查找数字字符的缩写是 \d,这等同于元字符 [0-9],它查找 0 到 9 之间任意数字的单个字符。
查找非数字字符的缩写是 \D。 这等同于字符串 [^0-9],它查找不是 0 - 9 之间数字的单个字符。
11.\s和\S
\s主要用于匹配空白字符,即匹配空格符、制表符(\t)、换行符(\n)、回车符(\r)、垂直制表符(\v)、换页符(\f),等价于字符类 [ \t\n\r\v\f]。
同理,使用 \S 搜寻非空白字符。 此匹配模式将不匹配空格、回车符、制表符、换页符和换行符。 可以认为这类似于元字符[^\t\n\r\v\f]。
12.花括号
花括号作为数量说明符,用于精确或范围性地指定前面元素(字符、字符类、分组等)的出现次数。有以下几种常见的使用形式:
固定次数 {n}:表示前面的元素必须恰好出现 n 次。
至少出现次数 {n,}:表示前面的元素至少要出现 n 次,出现次数可以是 n 次及以上的任意次数。
出现次数范围 {n,m}:表示前面的元素出现的次数最少为 n 次,最多为 m 次(n 和 m 均为非负整数,且 n <= m)
13.问号
问号除了将数量说明符从贪婪匹配模式转变为非贪婪匹配模式,还可以指定可能存在的元素,用于表示前面的元素出现零次或一次,即该元素是可选的。比如:
const regex = /colou?r/;
console.log(regex.test('color')); // true
console.log(regex.test('colour')); // true
14.括号
在正则表达式里,括号可以分组。有时候我们想使用正则表达式里的括号 () 来检查字符组。使用圆括号 () 可以将其中的内容组合成一个整体,这个整体被视为一个独立的单元,可对其应用各种正则操作,如量词限定、分支选择等。
// 正则表达式,用于匹配 123 或 456
let numberRegex = /(123|456)/;
// 待检查的字符串
let testStr4 = "The code is 123.";
let testStr5 = "Another code could be 456.";
let testStr6 = "No such code here.";
// 使用 test() 方法检查字符串中是否包含匹配项
console.log(numberRegex.test(testStr4)); // true
console.log(numberRegex.test(testStr5)); // true
console.log(numberRegex.test(testStr6)); // false
④断言
在正则表达式中,断言用于检查在某个位置的前后是否满足特定的条件,但并不实际消耗匹配的字符,也就是说断言只做位置的判断,不会将匹配的内容包含在最终的匹配结果里。常见的断言类型有先行断言、后行断言、负向先行断言和负向后行断言:
1.正向先行断言
要求在当前位置的后面必须匹配 pattern 模式,但 pattern 部分不会包含在最终的匹配结果中。
语法:(?=pattern)
const str = 'a1b2c3';
const regex = /[a-zA-Z](?=\d)/g;
const matches = str.match(regex);
console.log(matches); // 输出: [ 'a', 'b', 'c' ],表示匹配成功
2.负向先行断言
要求在当前位置的后面不能匹配 pattern 模式。
语法:(?!pattern)
const str = 'a1b c2';
const regex = /[a-zA-Z](?!\d)/g;
const matches = str.match(regex);
console.log(matches); // 输出: [ 'b' ],表示匹配成功
3.正向后行断言
要求在当前位置的前面必须匹配 pattern 模式,但 pattern 部分不会包含在最终的匹配结果中。
语法:(?<=pattern)
const str = '100 $200';
const regex = /(?<!\$)\d+/g;
const matches = str.match(regex);
console.log(matches); // 输出: [ '100' ],表示匹配成功
4.负向后行断言
要求在当前位置的前面不能匹配 pattern 模式。
语法:(?<!pattern)
const str = '100 $200';
const regex = /(?<!\$)\d+/g;
const matches = str.match(regex);
console.log(matches); // 输出: [ '100' ],表示匹配成功
⑤捕获组
当想要匹配一个多次出现的单词而不知道重复的特定单词,可以使用捕获组。
捕获组是通过在正则表达式里使用圆括号 () 来定义的,被括号包围的部分所匹配到的文本会被存储起来,每个捕获组都会被分配一个编号,编号从 1 开始,按照左括号出现的顺序依次递增,编号为 0 的捕获组表示整个正则表达式匹配的结果。
// 定义包含重复单词的字符串
const str = 'apple apple banana';
const regex = /(\w+) \1/;// 定义正则表达式,用于匹配重复单词,(\w+) 捕获单词,\1 引用该单词
const result = regex.test(str);
console.log(result);// 由于字符串中存在重复单词 "apple apple",所以此处会输出 true
⑥replace方法
replace() 方法是字符串对象的一个常用方法,用于在字符串中替换匹配到的子字符串。它可以结合正则表达式或者普通字符串来进行替换操作
str.replace(regexp|substr, newSubstr|function)
regexp|substr:可以是一个正则表达式对象,也可以是一个要被替换的普通字符串。
newSubstr|function:可以是一个用于替换匹配项的新字符串,也可以是一个回调函数,该回调函数会对每个匹配项进行处理并返回替换值。
返回一个新的字符串,其中匹配的部分已经被替换,原字符串不会被修改。
11万+

被折叠的 条评论
为什么被折叠?



