JavaScript 正则表达式
正则表达式(Regular Expressions,简称 RegEx 或 Regex)是一种强大的文本处理工具,它使用一种特殊的字符序列来定义搜索模式。这些模式可以用于搜索、替换或解析字符串中的文本。JavaScript 通过其 RegExp
对象提供了对正则表达式的支持。
一、正则表达式基础
字面量语法与构造函数语法:
字面量语法:
/pattern/flags
构造函数语法:
new RegExp(pattern, flags)
let regex1 = /abc/; // 字面量语法 let regex2 = new RegExp('abc'); // 构造函数语法
简单模式:
正则表达式可以包含普通字符(如字母、数字)和特殊字符(如
.
、*
、?
等)。普通字符匹配它们自身。
let regex = /hello/; console.log(regex.test('hello world')); // true
特殊字符:
.
:匹配除换行符之外的任何单个字符。*
:匹配前面的子表达式零次或多次。+
:匹配前面的子表达式一次或多次。?
:匹配前面的子表达式零次或一次。{n}
:匹配前面的子表达式恰好 n 次。{n,}
:匹配前面的子表达式至少 n 次。{n,m}
:匹配前面的子表达式至少 n 次,但不超过 m 次。
let regex = /ab{2}c/; // 匹配 "abbc" console.log(regex.test('abbc')); // true
字符类:
[abc]
:匹配方括号内的任一字符。[^abc]
:匹配不在方括号内的任一字符。[a-z]
:匹配指定范围内的任一字符。[^a-z]
:匹配不在指定范围内的任一字符。
let regex = /[a-z]/; // 匹配任何小写字母 console.log(regex.test('A')); // false console.log(regex.test('a')); // true
锚点:
^
:匹配输入字符串的开始位置。$
:匹配输入字符串的结束位置。
let regex = /^hello/; // 匹配以 "hello" 开头的字符串 console.log(regex.test('hello world')); // true console.log(regex.test('world hello')); // false
二、进阶用法
分组与捕获:
()
:用于分组和捕获匹配的子字符串。(?:...)
:非捕获分组。
let regex = /(\d{4})-(\d{2})-(\d{2})/; let match = regex.exec('2023-10-05'); console.log(match[1]); // "2023" console.log(match[2]); // "10" console.log(match[3]); // "05"
反向引用:
\n
:其中 n 是一个数字,表示对前面第 n 个捕获组的引用。
let regex = /(\w+)\s\1/; // 匹配重复的单词 console.log(regex.test('hello hello')); // true console.log(regex.test('hello world')); // false
选择、断言与懒惰匹配:
|
:选择运算符,匹配左边或右边的表达式。(?=...)
:正向肯定断言。(?!...)
:正向否定断言。*?
、+?
、{n,m}?
:懒惰匹配(尽可能少地匹配字符)。
let regex = /foo.*?bar/; // 懒惰匹配 "foo" 和 "bar" 之间的任意字符 console.log(regex.test('foobar')); // true console.log(regex.test('foo123bar')); // true,但只匹配到 "foo123bar" 中的 "foo123b"
三、标志(Flags)
i
:忽略大小写。g
:全局搜索。m
:多行搜索。s
:允许.
匹配换行符(ES2018 引入)。u
:启用 Unicode 完全匹配(ES6 引入)。y
:粘性匹配(从目标字符串的当前位置开始匹配,ES6 引入)。
let regex = /hello/gi; // 忽略大小写并全局搜索 "hello"
let str = 'Hello world! HELLO WORLD!';
let matches = str.match(regex);
console.log(matches); // ["Hello", "HELLO"]
四、在 JavaScript 中使用正则表达式
RegExp.prototype.test(str)
:测试字符串是否匹配正则表达式。String.prototype.match(regex)
:使用正则表达式匹配字符串,并返回一个数组(包含匹配结果)。String.prototype.search(regex)
:使用正则表达式搜索字符串,并返回匹配项的索引。String.prototype.replace(regex, replacement)
:使用正则表达式替换字符串中的匹配项。String.prototype.split(regex, limit)
:使用正则表达式分割字符串。
let str = 'The quick brown fox jumps over the lazy dog.';
let regex = /\s+/; // 匹配一个或多个空格
let words = str.split(regex);
console.log(words); // ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]
五、总结
正则表达式是处理字符串的强大工具,它们可以大大简化复杂的文本搜索、替换和解析任务。通过掌握正则表达式的基础和进阶用法,以及如何在 JavaScript 中使用它们,你可以编写出更高效、更简洁的代码。记住,正则表达式的学习是一个渐进的过程,通过不断的实践和应用,你会逐渐掌握它们的精髓。
本文地址:https://www.tides.cn/p_js-regexp