正则表达式
1.什么是正则表达式?
- 正则表达式是一种可以含有通配符的字符串表达式,它描述了一种字符串匹配的模式;
2.正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。 - 正则表达式通常被用来检索或替换那些符合某个模式的文本内容。
2.正则表达式的规则
正则表达式的内容放在两个反斜杠之间,正则表达式由普通字符和元字符组成
普通字符:又称字面量:字母、数字、中文字符等;(目前都用字母、数字)
元字符:在模式的上下文中具有特殊的意义:/ | ( ){}[] ^ $ * + ? .
1. 元字符 . (小数点) 可以匹配任何单个字符,除了换行符(\n)
比如:模式:/snow./
匹配的字符串:“snowy”、“snown”等;
对于模式/3.4/与/3.4/的区别:
模式/3.4/ 中的小数点 可以匹配任何单个字符,/3.4/ 中的小数点 就单纯是普通的小数点,就代表3.14
2. 元字符[] (中括号) 称为字符类,一个由普通字符组成的集合,一个字符类和它包含的任何单个字符都匹配;
格式:把需要的字符放到方括号中;
- 模式/[abc]/可以匹配a、b、c;又如: 模式/[a-z]/可以匹配a到z之间任意一个小写字母;
- 若字符类中第一个字符是“^”,含义为反转指定的字符集;
模式/[^exam]/
可以匹配除了e、x、a、m之外的所有字符;
JS中预定义的字符类:(可以通过名称来引用)
名称:\d 等价模式:[0-9] 匹配的内容:一个数字
名称:\D 等价模式:[^0-9] 匹配的内容:一个非数字
名称:\w 等价模式:[A-Za-z0-9_] 匹配的内容:一个单字字符
名称:\W 等价模式:[^A-Za-z0-9_] 匹配的内容:一个非单字字符
名称:\s 等价模式:[\r\t\n\f] 匹配的内容:一个空白字符
名称:\S 等价模式:[^\r\t\n\f] 匹配的内容:一个非空白字符
3. 元字符{} (花括号) 实现模式中某一部分的重复:
方法:在花括号中附加一个数字限定符;
- {n}:一个字符的n次重复;
- {m,n}:一个字符的m到n次重复;最少匹配 n 次且最多匹配 m 次。
- {m,}:一个字符不小于m次的重复;
模式/xy{3}z/匹配"xyyyz" ;
/u{2,4}/匹配"uu" "uuu" "uuuu" ;
/u{2,}/匹配"uu"、"uuu"等;
4. 元字符*+?(又称作符号限定符) 实现模式中某一部分的重复:
*:零次或多次重复;
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+:一次或多次重复;
匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?:零次或一次重复;
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。 ? 等价于 {0,1}。
runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。
runoo*b 中的 ,简单的说就是表示任何字符串的意思。如果要查找字符串中的 * 符号,则需要对 * 进行转义,即在其前加一个 \,runo*ob 匹配字符串 runoob。
5.元字符 ^$ \b \B
- :符号放到模式之前,就可指定该模式只匹配字符串的开头; /^Script/匹配“Scripting”
- $:符号$放到模式之后,就可指定该模式只匹配字符串的末尾; /gold$/匹配“I like gold”;
- \b:匹配的是单词的边界; /[1]ava[Ss]cript\b/匹配“JavaScript is fun”;
- \B:匹配不是单词边界的位置;
6. 元字符 i、g、m(又称修饰符) 修饰符可以放到模式(/)之后,用于修改模式的应用方式;
- 修饰符i:模式中的字母既可以匹配字符串中的小写字母又可以匹配大写字母;
/Watermelon/i: watermelon、WaterMelon等; - 修饰符g:全局匹配,即应当找出被检索字符串的所有匹配;
- 修饰符m:多模式匹配,针对多行字符串,匹配每行中的内容
3.正则表达式在JS中的应用
主要用于文本的模式匹配,包括文本的查找、替换和格式化;
JS中模式匹配有两种方式:
一种是基于RegExp类;
一种是基于String类;
1. String类的方法
search(正则表达式):以正则表达式作为参数,返回第一个与之匹配的子串开始的位置,若没有与之匹配的子串,返回-1;
<script>
var str="Hi,High,History.";
console.log(str.search(/Hi/)) ;//0
var str="ii,High,History.";
console.log(str.search(/Hi/)) ;//3
</script>
replace(正则表达式,替换字符串):替换String对象中与给定模式匹配的某个子字符串,返回值为替换后的新串;
<script>
var str="snow snows snowy snowing snowed";
console.log(str.replace(/snow/,"rain"));//rain snows snowy snowing snowed
//若模式后有g,则String对象中每个匹配的子字符串都将被替换;
var str="snow snows snowy snowing snowed";
console.log(str.replace(/snow/g,"rain"));
//rain rains rainy raining rained
</script>
match(正则表达式):返回值为一个数组;
<script>
/*若正则表达式中不带有g,
数组的第一个元素为字符串中第一个与模式匹配的子字符串,
数组剩余的元素为与模式括号中的部分匹配的元素;
*/
var str="snow snows snowy snowing snowed sow aa bb";
console.log(str.match(/snow/));
//["snow", index: 0, input: "snow snows snowy snowing snowed sow aa bb", groups: undefined]
// 2. 若正则表达式中带有g,数组为字符串中所有与模式匹配的子字符串;
var str="snow snows snowy snowing snowed sow aa bb";
console.log(str.match(/snow/g));
//显示:(5) ["snow", "snow", "snow", "snow", "snow"]
</script>
2.RegExp类的方法
JS中正则表达式不是字符串类型,而是预定义类型RegExp
**步骤:
- 创建RegExp对象:(以下三种方式)
var re=new RegExp(/…/gi);
var re=/…/gi;(用的最多)
var re=new RegExp(“…”,“gi”); - 调用RegExp的test(”字符串”),返回值布尔值;**
1. 举例1
要求:
通过表单输入你的家庭电话,点击验证按钮测试一下格式是否正确;
如果正确弹出警告框: It is a legal phone number!
不正确弹出警告框: It is not a legal phone number!
分析:
- 当用户单击验证按钮时,执行函数testPhoneNumber();(事件机制)
- 事件处理函数testPhoneNumber()的处理逻辑:
(1) JS通过DOM获取用户在单行文本框中输入的字符串str(input元素的value属性);
(2)用正则表达式reg定义家庭电话;
(3)调用test()验证str和reg是否匹配,然后输出不同的提示信息。
<body>
请输入你的家庭电话:<input type="text" name="number" id="number"/><br/>
<input type="button" value="验证" onclick="testPhoneNumber()"/>
<script>
function testPhoneNumber(){
var phone=document.getElementById("number").value;
var ok=/^\d{3,4}-\d{7,8}$/.test(phone);
if(ok)
{alert("It is a legal phone number!");}
else{ alert("It is not a legal phone number!");
}
}
</script>
</body>
Jj ↩︎
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现