正则表达式
正则表达式
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。具有强大的模式匹配和文本检索与替换功能。
正则表达式的定义
在 JavaScript 中,可以通过两种方式定义正则表达式:
正则表达式字面量: 使用一对斜杠(
/)包围正则表达式模式。1
let regex = /pattern/flags;
例如:
1
let regex = /hello/i;
RegExp 构造函数: 使用
RegExp构造函数来创建正则表达式。1
let regex = new RegExp('pattern', 'flags');
例如:
1
let regex = new RegExp('hello', 'i');
正则表达式的标志(Flags)
正则表达式标志用于修改正则表达式的行为。常见的标志包括:
g:全局搜索(global search)。i:不区分大小写搜索(case-insensitive search)。m:多行搜索(multi-line search)。s:允许点号(.)匹配换行符(newline characters)。u:启用 Unicode 匹配。y:粘性匹配(sticky search),从目标字符串的当前位置开始匹配。
常用的正则表达式方法
1、**test()**: 测试字符串中是否存在与正则表达式模式匹配的文本,返回布尔值。
1 | let regex = /hello/; |
2、**exec()**: 搜索字符串中与正则表达式模式匹配的文本,返回一个结果数组或 null。
1 | let regex = /hello/; |
正则表达式的基本模式
字符类:
.:匹配除换行符外的任何单个字符。\d:匹配一个数字(0-9)。\D:匹配一个非数字字符。\w:匹配一个字母、数字或下划线字符。\W:匹配一个非字母、数字或下划线字符。\s:匹配一个空白字符(包括空格、制表符等)。\S:匹配一个非空白字符。
边界匹配:
^:匹配字符串的开始。$:匹配字符串的结束。\b:匹配单词边界。\B:匹配非单词边界。
量词:
*:匹配前一个字符 0 次或多次。+:匹配前一个字符 1 次或多次。?:匹配前一个字符 0 次或 1 次。{n}:匹配前一个字符恰好 n 次。{n,}:匹配前一个字符至少 n 次。{n,m}:匹配前一个字符至少 n 次,但不超过 m 次。
什么是贪婪匹配和非贪婪匹配:
贪婪匹配
贪婪匹配(Greedy Matching) 会尽可能多地匹配字符。这是正则表达式的默认行为。
例如,考虑以下正则表达式和字符串:
1 | let regex = /a.*b/; |
在这个例子中,.* 是贪婪的,它会尝试匹配尽可能多的字符,以使整个表达式匹配成功。因此,它从第一个 a 开始,直到最后一个 b 才停止匹配。
在正则表达式中,“贪婪匹配”和“非贪婪匹配”是用于描述重复量词(如 *, +, ?, {})的两种不同行为。
贪婪匹配
贪婪匹配(Greedy Matching) 会尽可能多地匹配字符。这是正则表达式的默认行为。
例如,考虑以下正则表达式和字符串:
1 | javascript |
在这个例子中,.* 是贪婪的,它会尝试匹配尽可能多的字符,以使整个表达式匹配成功。因此,它从第一个 a 开始,直到最后一个 b 才停止匹配。
非贪婪匹配
非贪婪匹配(Non-Greedy Matching),也称为“懒惰匹配(Lazy Matching)”,会尽可能少地匹配字符。使用 ? 来表示非贪婪匹配。
例如,考虑以下正则表达式和字符串:
1 | let regex = /a.*?b/; |
在这个例子中,.*? 是非贪婪的,它会尽可能少地匹配字符。因此,它从第一个 a 开始,匹配到第一个 b 就停止匹配。