正则表达式
正则表达式
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。具有强大的模式匹配和文本检索与替换功能。
正则表达式的定义
在 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
就停止匹配。