JavaScript 正则表达式(RegExp)是一个强大的工具,用于模式匹配和文本处理。学习和掌握正则表达式能有效提高处理字符串的效率。正则表达式是用于匹配字符组合的模式,通常用于字符串搜索和替换等操作。在 JavaScript 中,正则表达式是由 RegExp 对象表示的。
正则表达式可以通过两种方式创建:字面量和构造函数。
字面量语法:
const regex = /pattern/flags;
构造函数语法:
const regex = new RegExp('pattern', 'flags');
pattern
是要匹配的文本模式,flags
是可选的标志,用于控制搜索的行为。例如,i
标志用于不区分大小写匹配,g
标志用于全局匹配等。
正则表达式中有很多元字符,它们在模式中有特殊的含义。
.
:匹配除换行符以外的任何单个字符。^
:匹配输入的开始位置。$
:匹配输入的结束位置。*
:匹配前一个表达式 0 次或多次。+
:匹配前一个表达式 1 次或多次。?
:匹配前一个表达式 0 次或 1 次。\
:用于转义特殊字符。[]
:匹配括号内的任意字符。|
:表示“或”操作,比如 a|b
匹配 "a" 或 "b"。()
:用于分组,捕获匹配的子串。预定义类用于简化模式的编写:
\d
:匹配一个数字字符,相当于 [0-9]
。\D
:匹配一个非数字字符,相当于 [^0-9]
。\w
:匹配一个字母、数字或下划线字符,相当于 [a-zA-Z0-9_]
。\W
:匹配一个非字母、非数字、非下划线字符。\s
:匹配一个空白字符,包括空格、制表符、换页符等。\S
:匹配一个非空白字符。JavaScript 提供了一些方法来操作正则表达式:
test()
方法:
返回一个布尔值,指示是否存在与模式匹配的字符串。
const regex = /hello/;
console.log(regex.test('hello world')); // true
exec()
方法:
返回一个数组,其中包含匹配的内容。如果没有匹配,则返回 null
。
const regex = /hello/;
console.log(regex.exec('hello world')); // ['hello']
字符串方法与正则表达式结合使用:
match()
方法:
返回一个数组,包含所有匹配的结果。
const str = 'hello world';
const matches = str.match(/o/g);
console.log(matches); // ['o', 'o']
replace()
方法:
执行查找和替换操作。
const str = 'hello world';
const newStr = str.replace(/world/, 'JavaScript');
console.log(newStr); // 'hello JavaScript'
search()
方法:
返回字符串中匹配项的索引。找不到则返回 -1
。
const str = 'hello world';
console.log(str.search(/world/)); // 6
split()
方法:
使用正则表达式分割字符串。
const str = 'hello world, welcome';
const parts = str.split(/,\s*/);
console.log(parts); // ['hello world', 'welcome']
正则表达式的分组功能意味着你可以在模式中组合多个字符,并在匹配中以单个单元处理它们。分组通过小括号 ()
实现。
捕获组:
捕获的组可以使用反斜杠 \
加数字的方式引用。比如 /(hi|hello)/
可以匹配 "hi" 或 "hello"。
命名捕获组:
JavaScript 支持命名捕获组,这使得引用变得更加直观。通过 ?<name>
语法,你可以为组命名。
const regex = /(?<greeting>hello|hi) (\w+)/;
const result = regex.exec('hello world');
console.log(result.groups.greeting); // 'hello'
使用反斜杠 \
加数字来引用捕获的组,称为回溯引用。
const regex = /(\w+)\s\1/;
const str = 'hello hello';
console.log(regex.test(str)); // true
在这个例子中,\1
指的是*个捕获组,即之前匹配的 \w+
。
零宽断言用于指定匹配的前后环境,包括正向断言、负向断言等。
正向断言 (?=...):在匹配时需要后面的表达式。
const regex = /\d+(?= dollars)/;
const str = '100 dollars';
console.log(str.match(regex)); // ['100']
负向断言 (?!...):在匹配时不需要后面的表达式。
const regex = /\d+(?! dollars)/;
const str = '100 euros';
console.log(str.match(regex)); // ['100']
有时候,你只想分组而不捕获匹配,因而可以使用非捕获组 (?:...)
。
const regex = /(?:hi|hello) \w+/;
const str = 'hello world';
console.log(regex.test(str)); // true
贪婪匹配:默认情况下,正则表达式是贪婪的,它总是尝试匹配尽可能长的字符串。
const str = 'a123b';
const regex = /a.*b/;
console.log(str.match(regex)); // ['a123b']
懒惰匹配:在量词后加 ?
可以使其变为懒惰匹配,即匹配尽可能短的字符串。
const str = 'a123b';
const regex = /a.*?b/;
console.log(str.match(regex)); // ['a123b']
掌握正则表达式需要一定的练习和应用,因为其自身的复杂性,但一旦掌握,它将成为处理字符串和进行文本分析的强大工具。在 JavaScript 中,合理使用正则表达式可以简化代码,提高应用程序的效率和可读性。此外,虽然正则表达式很强大,但也要注意其性能问题,在复杂情况下可能会导致性能下降。因此,应小心构建正则表达式并分析其实际应用效果。