本文系统介绍 JavaScript 中正则表达式的核心用法,涵盖 RegExp 对象的 test 与 exec 方法区别,以及字符串处理中的 search、match、replace 和 split 方法。同时详细解析字符集、边界匹配、量词等常见正则语法,并提供汉字、手机号、邮箱等实用匹配示例,帮助开发者高效进行文本模式匹配与处理。
JavaScript 正则表达式基础
本文直接切入主题,旨在帮助读者掌握 JavaScript 中正则表达式的具体应用技巧。
基础定义与使用规范
var patt1 = new RegExp("hello");
var patt2 = /world/ ;
RegExp 对象方法:test 与 exec
test 方法详解
test() 函数用于检测字符串中是否包含指定的正则模式。该方法返回布尔值:若找到匹配项则返回 true,否则返回 false。
var pat = /my/;
var str = "this is my code...";
console.log(pat.test(str)); // true
exec 方法详解
exec() 函数用于检索字符串中与正则表达式匹配的值。若找到匹配,则返回包含匹配信息的数组;若未找到匹配项,则返回 null。
var pat = /hello/;
console.log(pat.exec("oh hello world")); //返还hello
正则表达式语法结构
正则表达式语法结构
正则表达式的标准写法为 /pattern/attributes。其中 pattern 代表匹配模式,attributes 为可选的标志字符串,常用的有 'g'(全局匹配)和 'i'(忽略大小写)。
var str = "Visit Hunger";
var patt1 = /hunger/i; //不区分大小写
console.log(str.match(patt1)); //全局匹配
var str="hello hunger valley! I am hunger";
var patt1=/hunger/g;
console.log(str.match(patt1)); //不区分大小写,全局匹配
var str="hello Hunger valley! I am hunger";
var patt1=/hunger/gi;
console.log(str.match(patt1));
字符串处理中的正则应用
字符串与正则的交互方法
1. search 方法
用于在字符串中搜索与正则表达式匹配的子串,并返回第一个匹配项的起始索引位置。
var str="Visit W3School!";
console.log(str.search(/w3school/)); //-1 console.log(str.serach(/w3school/i)); // 6
2. match 方法
用于查找字符串中与正则表达式匹配的所有子串。若未指定全局标志 'g',则返回第一个匹配项及其捕获组;若指定 'g',则返回所有匹配项的数组。
var str="1 plus 2 equal 33";
console.log(str.match(/\d+/)); //[1]
console.log(str.match(/\d+/g)); //[1,2,33]
3. replace 方法
用于将字符串中与正则表达式匹配的部分替换为指定的新字符串,并返回替换后的新字符串。
var str="Hello JI! oh I am hunger"
console.log(str.replace(/Hunger/, "valley")); console.log(str.replace(/hunger/ig, "hunger"));
4. split 方法
用于根据正则表达式定义的规则将字符串分割为子字符串数组。
var str = "Hello Hunger , oh I am Hunger";
str.split("");
str.split(/\s+/);
常用正则语法符号解析
常用正则语法符号
字符集匹配:[abc] 用于匹配方括号内包含的任意单个字符。
var str="Is this all there is?";
var patt1=/[a-h]/g;
console.log(str.match(patt1));
否定字符集:[^abc] 用于匹配不在方括号内的任意单个字符。
var str="hello jikexueyuan!";
var patt1=/[^jike]/g;
console.log(str.match(patt1));
范围匹配:[0-9] 用于匹配从 0 到 9 之间的任意数字字符。
小写字母范围:[a-z] 用于匹配从 a 到 z 的小写英文字母。
大写字母范围:[A-Z] 用于匹配从 A 到 Z 的大写英文字母。
大小写混合范围:[A-z] 用于匹配从 A 到 z 之间的所有字符(包含部分特殊符号)。
集合匹配:[adgk] 用于匹配给定集合 {a, d, g, k} 中的任意一个字符。
否定集合:[^adgk] 用于匹配不在给定集合 {a, d, g, k} 中的任意字符。
多选分支:red|blue|green 用于匹配指定的多个选项中的任意一个。
var str="hello hunger! How are you?";
var patt1=/hello|you/g; c
onsole.log(str.match(patt1));
通配符:. 用于匹配除换行符和行结束符之外的任意单个字符。
var str="That's hot!";
var patt1=/h.t/g;
document.write(str.match(patt1));
单词字符:\w 用于匹配字母、数字、下划线组成的单词字符。
var str="Give 100%!";
var patt1=/\w/g;
document.write(str.match(patt1));
非单词字符:\W 用于匹配非单词字符(即非字母、数字、下划线)。
var str="Give 100%!"; var patt1=/\W/g; document.write(str.match(patt1));
数字匹配:\d 用于匹配任意阿拉伯数字。
var str="Give 100%!";
var patt1=/\d/g;
document.write(str.match(patt1));
非数字匹配:\D 用于匹配非数字字符。
var str="Give 100%!"; var patt1=/\D/g; document.write(str.match(patt1));
空白字符:\s 用于匹配空格、制表符、换行符、回车符等空白字符。
var str="Is this all there is?";
var patt1=/\s/g; document.write(str.match(patt1));
非空白字符:\S 用于匹配非空白字符。
var str="Is this all there is?"; var patt1=/\S/g; document.write(str.match(patt1));
单词边界:\b 用于匹配单词边界,即单词字符与非单词字符之间的位置。
边界匹配示例:/\bm/ 可匹配 'moon' 中的 'm';/oo\b/ 不匹配 'moon' 中的 'oo',因为其后紧跟单词字符 'n';/oon\b/ 可匹配 'moon' 中的 'oon',因其位于字符串末尾。
var str="Hello jikexueyuan";
var patt1=/\bjikexueyuan/g;
document.write(str.match(patt1));
非单词边界:\B 用于匹配非单词边界的位置。
换行符:\n 用于匹配换行符。
var str="Hello Hunger.\n be a FE.";
var patt1=/\n/g; document.write(str.search(patt1));
量词加号:n+ 用于匹配包含至少一个 n 的字符串序列。
var str="Hello HHunger! Hello World!";
var patt1=/H+/g;
document.write(str.match(patt1));
var str="Hello Hunger! Hello World!";
var patt1=/\w+/g; document.write(str.match(patt1));
量词星号:n* 用于匹配包含零个或多个 n 的字符串序列。
var str="Hellooo Hunger! Hello World!"; var patt1=/lo*/g; document.write(str.match(patt1))
量词问号:n? 用于匹配包含零个或一个 n 的字符串序列。
var str="1, 100 or 1000?"; var patt1=/10?/g; document.write(str.match(patt1));
精确重复:n{X} 用于匹配恰好包含 X 个 n 的序列。
var str="100, 1000 or 10000?"; var patt1=/\d{4}/g; document.write(str.match(patt1));
范围重复:n{X,Y} 用于匹配包含 X 到 Y 个 n 的序列。
var str="100, 1000 or 10000?"; var patt1=/\d{3,4}/g; document.write(str.match(patt1));
最小重复:n{X,} 用于匹配包含至少 X 个 n 的序列。
var str="100, 1000 or 10000?"; var patt1=/\d{3,}/g; document.write(str.match(patt1));
结尾锚点:n$ 用于匹配以 n 结尾的字符串。
var str="Is this his"; var patt1=/is$/g; document.write(str.match(patt1));
开头锚点:^n 用于匹配以 n 开头的字符串。
var str="Is this his"; var patt1=/^Is/g; document.write(str.match(patt1));
常见正则匹配场景示例
常见应用场景示例
常用正则模式:汉字匹配使用 [\u4e00-\u9fa5];手机号匹配使用 1[0-9]{10};邮箱匹配使用 (\S)+[@]{1}(\S)+[.]{1}(\w)+