正则表达式之字符串模式匹配实例详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">前言</a></li><li><a href="#_label1">什么是正则表达式</a></li><li><a href="#_label2">字符范围匹配</a></li><li><a href="#_label3">元字符</a></li><li><a href="#_label4">多次重复匹配</a></li><li><a href="#_label5">定位匹配</a></li><li><a href="#_label6">贪婪模式与非贪婪模式</a></li><li><a href="#_label7">表达式分组</a></li><li><a href="#_label8">结语</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>前言</h2><p>今天我们来学习正则表达式,正则表达式的应用十分广泛,几乎每个涉及到交互的项目都会用到的,学会正则表达式之后会让你除了提高效率外,会给你带来绝对的成就感。</p>
<p>接下来我们正式开始!</p>
<p class="maodian"><a name="_label1"></a></p><h2>什么是正则表达式</h2>
<blockquote><p>正则表达式是检查、匹配字符串的表达式</p></blockquote>
<p>正则表达式用来描述某种规则,同时它不是某种语言专有的技术,它对主流的语言都有良好的支持。</p>
<p>正则表达式的主要使用场景是:字符串检验,查找与替换。</p>
<p>示例:检查输入身份证号是否合法的正则表达式</p>
<p>正则表达式:<code>(^\d{18}$)|(^\d{17}(\d|X|x)$)</code></p>
<p>现在你也许看不懂,但是等看完这篇博客之后在加以练习你就能轻松写出来了。</p>
<p class="maodian"><a name="_label2"></a></p><h2>字符范围匹配</h2>
<p>下面这个表是对单个字符约束的一些正则表达式:</p>
<table><thead><tr><th>正则表达式</th><th>说明</th></tr></thead><tbody><tr><td>A</td><td>精准匹配单个字符</td></tr><tr><td>x|y</td><td>允许出现的2个字符</td></tr><tr><td></td><td>字符集合,允许出现的2个字符</td></tr><tr><td></td><td>字符集合</td></tr><tr><td>[^xyz]</td><td>集合内字符不允许出现</td></tr></tbody></table>
<p>例如:匹配数字范围(0570-0579)</p>
<p>正则表达式为:057</p>
<p class="maodian"><a name="_label3"></a></p><h2>元字符</h2>
<blockquote><p>用于匹配的特殊符号又称作元字符</p></blockquote>
<p>常用的元字符如下:</p>
<table><thead><tr><th>正则表达式</th><th>说明</th></tr></thead><tbody><tr><td>\d</td><td>匹配任意单个数字</td></tr><tr><td>\D</td><td>匹配\d规则以外的任意单个字符</td></tr><tr><td>\w</td><td>匹配任意单个数字字母下划线</td></tr><tr><td>\W</td><td>匹配\w规则以外的任意单个字符</td></tr><tr><td>\s</td><td>匹配单个空格</td></tr><tr><td>\n</td><td>匹配单个换行符</td></tr><tr><td>.</td><td>匹配任意单个字符(换行符除外)</td></tr><tr><td>\.</td><td>特殊字符只匹配.</td></tr></tbody></table>
<p>示例:请匹配杭州与宁波座机号码(0571|0574-XXXXXXXX)</p>
<p>正则表达式为:057-\d\d\d\d\d\d\d\d</p>
<p class="maodian"><a name="_label4"></a></p><h2>多次重复匹配</h2>
<p>当我们匹配的字符串比较长,比如身份证号有18为一个一个写\d比较麻烦,多次重复匹配只能简化我们的操作。</p>
<p>常用的多次重复匹配如下:</p>
<table><thead><tr><th>正则表达式</th><th>说明</th></tr></thead><tbody><tr><td>A{N}</td><td>精准N次匹配</td></tr><tr><td>A{N,}</td><td>最少出现N次</td></tr><tr><td>\d{N,M}</td><td>最少可以出现N次,最多可以出现M次</td></tr><tr><td>\d*</td><td>可以出现零次至无限次</td></tr><tr><td>\d+</td><td>最少出现一次,相当于{1,}</td></tr><tr><td>\d?</td><td>最多出现1次,相当于{0,1}</td></tr></tbody></table>
<p>示例:匹配全国的座机号(区号3或4位-电话号码7或8位)</p>
<p>正则表达式:\d{3,4}-\d{7,8}</p>
<p class="maodian"><a name="_label5"></a></p><h2>定位匹配</h2>
<table><thead><tr><th>正则表达式</th><th>说明</th></tr></thead><tbody><tr><td>^A.*</td><td>头匹配-以字符A开头</td></tr><tr><td>.*A$</td><td>尾匹配-以字符A结尾</td></tr><tr><td>^A.*A$</td><td>全字匹配-以字符A开头结尾</td></tr></tbody></table>
<p>示例:以C开头,B结尾的字符串</p>
<p>正则表达式:^C.*B$</p>
<p class="maodian"><a name="_label6"></a></p><h2>贪婪模式与非贪婪模式</h2>
<blockquote><p>贪婪模式:在满足条件的情况下尽可能多匹配到字符串<br />非贪婪模式:在满足条件的情况下尽可能少匹配到字符串</p></blockquote>
<p>正则表达式在默认的情况下就是贪婪模式</p>
<p>示例:输入123456</p>
<ul><li>在使用正则表达式\d{4,5},之后匹配到的是12345,可见这就是贪婪模式。</li><li>在使用正则表达式\d{4,5}?,之后匹配到的是1234,可见这就是非贪婪模式。</li></ul>
<p>可见,只需要在正则表达式的后面加一个?,就可以从贪婪模式变换到非贪婪模式。</p>
<p class="maodian"><a name="_label7"></a></p><h2>表达式分组</h2>
<blockquote><p>分组就是将正则分组为多个子表达式。</p></blockquote>
<p>示例:abababcdcdcd</p>
<p>正则表达式:(ab){3}(cd){3}</p>
<p>示例:检查输入身份证号是否合法的正则表达式</p>
<p>正则表达式:(^\d{18}$)|(^\d{17}(\d|X|x)$)</p>
<p>结合JavaScript练习正则表达式</p>
<blockquote><p>在JS中定义正则表达式对象只需要在//之间书写正则表达式即可</p></blockquote>
<p>我们实现用表单来验证输入姓名和身份证号是否合法。</p>
<div class="jb51code"><pre class="brush:xhtml;"><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="#" method="post" id ="frmInfo">
<div id="err" style="color:red">
</div>
<div>
姓名:<input id="name" name="name"/>
</div>
<div>
身份证:<input id ="idno" name="idno"/>
</div>
<div>
<input type = "submit"/>
</div>
</form>
<script type="text/javascript">
document.getElementById("frmInfo").onsubmit = function(){
//汉字范围\u4e00-\u9fa5
var regex1 = /^[\u4e00-\u9fa5]{2,8}$/;
var regex2 = /^\d{16}$/;
var name = document.getElementById("name").value;
var idno = document.getElementById("idno").value;
//利用正则表达式进行匹配,true-匹配,false-失败
if(regex1.test(name) == false){
document.getElementById("err").innerHTML = "无效姓名";
return false;
}else if(regex2.test(idno) == false){
document.getElementById("err").innerHTML = "无效身份证号";
return false;
}else{
alert("验证通过,准备提交!");
return true;
}
}
</script>
</body>
</html>
</pre></div>
<p>输出:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202204/202204220923425.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202204/202204220923426.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202204/202204220923437.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202204/202204220923438.png" /></p>
<p class="maodian"><a name="_label8"></a></p><h2>结语</h2>
<p>多加练习之后,书写起来还是比较简单的。而且很有成就感。加油!</p>
頁:
[1]