绿色小草 發表於 2022-10-9 10:04:57

正则表达式RegExp语法与用法详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">正则表达式的定义和用途</a></li><li><a href="#_label1">创建正则表达式</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">方式一:使用构造函数创建</a></li><li><a href="#_lab2_1_1">方式二:使用字面量创建</a></li></ul><li><a href="#_label2">正则表达式的语法</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_2">匹配字符</a></li><li><a href="#_lab2_2_3">简写</a></li><li><a href="#_lab2_2_4">模式修正符</a></li><li><a href="#_lab2_2_5">贪婪匹配</a></li><li><a href="#_lab2_2_6">断言</a></li></ul><li><a href="#_label3">正则表达式的使用</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_7">搜索第一个符合条件的字符串 search()</a></li><li><a href="#_lab2_3_8">搜索所有符合条件的字符串 match()</a></li><li><a href="#_lab2_3_9">字符串拆分成数组 split()</a></li><li><a href="#_lab2_3_10">&nbsp;字符串替换 replace()</a></li><ul class="third_class_ul"><li><a href="#_label3_3_10_0">过滤HTML标签&nbsp;</a></li><li><a href="#_label3_3_10_1">去除空格</a></li></ul></ul><li><a href="#_label4">常用正则表达式</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>正则表达式的定义和用途</h2>
<p>正则表达式用于定义一些字符串的规则。计算机可以根据正则表达式,来检查一个字符串是否符合指定的规则,或者将字符串中符合规则的内容提取出来。</p>
<p>RegExp的意思是 Regular expression。使用typeof检查正则对象,会返回object。</p>
<p class="maodian"><a name="_label1"></a></p><h2>创建正则表达式</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>方式一:使用构造函数创建</h3>
<p>使用构造函数创建时,更加灵活,因为参数中还可以传递变量。</p>
<div class="jb51code"><pre class="brush:js;">        var 变量 = new RegExp("正则表达式"); // 注意,参数是字符串
        var 变量 = new RegExp("正则表达式", "匹配模式"); // 注意,两个参数都是字符串</pre></div>
<p>匹配模式作为第二个参数。这个参数可以是:</p>
<ul><li>i 忽略大小写。这里的 i 指的是 ignore。</li><li>g 全局匹配模式。这里的 g 指的是 global。</li></ul>
<div class="jb51code"><pre class="brush:js;">var reg = new RegExp("a"); // 定义一个正则表达式:检查一个字符串中是否含有 a

var reg = new RegExp('A', 'i');
var str = 'qiangu';

console.log(reg.test(str)); // 打印结果:true</pre></div>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>方式二:使用字面量创建</h3>
<div class="jb51code"><pre class="brush:js;">        var 变量 = /正则表达式/;// 注意,这个语法里没有引号

        var 变量 = /正则表达式/匹配模式;// 注意,这个语法里没有引号
        var reg = /A/i; // 定义正则表达式的规则:检查一个字符串中是否含有 a。忽略大小写。
        var str = "qiangu";

        console.log(typeof reg);// 打印结果:object
        console.log(reg.test(str)); // 打印结果:true</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>正则表达式的语法</h2>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>匹配字符</h3>
<table border="1" cellspacing="0"><thead><tr><th>字符</th><th>描述</th></tr></thead><tbody><tr><td>.</td><td>匹配任意单个字符除了换行符</td></tr><tr><td>[ ]</td><td>[ ] 内为字符集,匹配 [ ] 内任一字符</td></tr><tr><td>[^ ]</td><td>匹配除了方括号里的任意字符</td></tr><tr><td>*</td><td>匹配 &gt;= 0 个 * 号前的字符。</td></tr><tr><td>+</td><td>匹配 &gt;= 1 个+号前的字符。</td></tr><tr><td>?</td><td>匹配 0 或 1 个 ?号前的字符。</td></tr><tr><td>{n,m}</td><td>匹配n到m个大括号之前的字符或字符集</td></tr><tr><td>(xyz)</td><td>匹配与 xyz 完全相等的字符串</td></tr><tr><td>|</td><td>或运算符,匹配|符号前或后的字符</td></tr><tr><td>\s</td><td>匹配空格</td></tr><tr><td>\</td><td>转义字符,匹配一些保留的字符&nbsp;[ ] ( ) { } . * + ? ^ $ \ |</td></tr><tr><td>^</td><td>从开始行开始匹配</td></tr><tr><td>$</td><td>从末端开始匹配</td></tr></tbody></table>
<ul><li>// 等价于 /a|b/:检查一个字符串中是否包含 a或b</li><li>//:检查一个字符串那种是否包含任意小写字母</li><li>//:任意大写字母</li><li>//:任意字母</li><li>//:任意数字</li><li>/ac/:检查一个字符串中是否包含 abc 或 adc 或 aec</li><li>he 匹配 the 和 The</li><li>[^c]ar 匹配一个后面跟着ar的除了c的任意字符,如匹配par,不匹配car</li><li>* 匹配一个行中所有以小写字母开头的字符串。</li></ul>
<div class="jb51code"><pre class="brush:js;">"*" =&gt; The car parked in the garage</pre></div>
<p>c.+t 匹配以首字母c开头以t结尾,中间跟着至少一个字符的字符串</p>
<div class="jb51code"><pre class="brush:js;">"c.+t" =&gt; The fat cat sat on the mat</pre></div>
<ul><li>?he 匹配字符串 he 和 The</li><li>{2,3} 匹配最少 2 位最多 3 位 0~9 的数字</li><li>可以省略第二个参数。 例如,{2,} 匹配至少两位 0~9 的数字。</li><li>逗号也省略掉则表示重复固定的次数。 例如,{3} 匹配3位数字</li><li>(c|g|p)ar 匹配 car 或 gar 或 par</li><li>&quot;(f|c|m)at\.?&quot; =&gt; The fat cat sat on the mat.</li><li>&quot;(T|t)he&quot; =&gt; The car is parked in the garage.</li><li>&quot;^(T|t)he&quot; =&gt; The car is parked in the garage.</li></ul>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>简写</h3>
<table border="1" cellspacing="0"><thead><tr><th>简写</th><th>描述</th></tr></thead><tbody><tr><td>\w</td><td>匹配所有字母数字,等同于&nbsp;<code></code></td></tr><tr><td>\W</td><td>匹配所有非字母数字,即符号,等同于:&nbsp;<code>[^\w]</code></td></tr><tr><td>\d</td><td>匹配数字:&nbsp;<code></code></td></tr><tr><td>\D</td><td>匹配非数字:&nbsp;<code>[^\d]</code></td></tr><tr><td>\s</td><td>匹配所有空格字符,等同于:&nbsp;<code>[\t\n\f\r\p{Z}]</code></td></tr><tr><td>\S</td><td>匹配所有非空格字符:&nbsp;<code>[^\s]</code></td></tr><tr><td>\f</td><td>匹配一个换页符</td></tr><tr><td>\n</td><td>匹配一个换行符</td></tr><tr><td>\r</td><td>匹配一个回车符</td></tr><tr><td>\t</td><td>匹配一个制表符</td></tr><tr><td>\v</td><td>匹配一个垂直制表符</td></tr><tr><td>\p</td><td>匹配 CR/LF(等同于&nbsp;<code>\r\n</code>),用来匹配 DOS 行终止符</td></tr></tbody></table>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>模式修正符</h3>
<table border="1" cellspacing="0"><thead><tr><th>标志</th><th>描述</th></tr></thead><tbody><tr><td>i</td><td>忽略大小写。</td></tr><tr><td>g</td><td>全局搜索。</td></tr><tr><td>m</td><td>多行修饰符:锚点元字符&nbsp;<code>^</code>&nbsp;<code>$</code>&nbsp;工作范围在每行的起始。</td></tr></tbody></table>
<ul><li>&quot;/The/gi&quot; =&gt; The fat cat sat on the mat.</li><li>&quot;/.(at)/g&quot; =&gt; The fat cat sat on the mat.</li><li>(^,$) 用于检查格式是否是在待检测字符串的开头或结尾。但我们如果想要它在每行的开头和结尾生效,我们需要用到多行修饰符 m。</li></ul>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202210/202210090940232.png" /></p>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>贪婪匹配</h3>
<p>正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽可能长的子串。</p>
<div class="jb51code"><pre class="brush:js;">"/(.*at)/" =&gt; The fat cat sat on the mat.</pre></div>
<p>惰性匹配</p>
<p>使用 ? 将贪婪匹配模式转化为惰性匹配模式。</p>
<div class="jb51code"><pre class="brush:js;">"/(.*?at)/" =&gt; The fat cat sat on the mat.</pre></div>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>断言</h3>
<table border="1" cellspacing="0"><thead><tr><th>符号</th><th>描述</th></tr></thead><tbody><tr><td>?=</td><td>正先行断言-存在</td></tr><tr><td>?!</td><td>负先行断言-排除</td></tr><tr><td>?&lt;=</td><td>正后发断言-存在</td></tr><tr><td>?&lt;!</td><td>负后发断言-排除</td></tr></tbody></table>
<ul><li>定义一个正先行断言要使用 ()。在括号内部使用一个问号和等号: (?=...)。正先行断言的内容写在括号中的等号后面。 例如,表达式 (T|t)he(?=\sfat) 匹配 The 和 the,在括号中我们又定义了正先行断言 (?=\sfat) ,即 The 和 the 后面紧跟着 (空格)fat。</li></ul>
<div class="jb51code"><pre class="brush:js;">"(T|t)he(?=\sfat)" =&gt; The fat cat sat on the mat.</pre></div>
<ul><li>负先行断言 ?! 用于筛选出其后不跟随断言中定义的格式。表达式 (T|t)he(?!\sfat) 匹配 The 和 the,且其后不跟着 (空格)fat。</li></ul>
<div class="jb51code"><pre class="brush:js;">"(T|t)he(?!\sfat)" =&gt; The fat cat sat on the mat.</pre></div>
<ul><li>正后发断言 记作(?&lt;=...) 用于筛选所有匹配结果,筛选条件为 其前跟随着断言中定义的格式。 例如,表达式 (?&lt;=(T|t)he\s)(fat|mat) 匹配 fat 和 mat,且其前跟着 The 或 the。</li></ul>
<div class="jb51code"><pre class="brush:js;">"(?&lt;=(T|t)he\s)(fat|mat)" =&gt; The fat cat sat on the mat.</pre></div>
<ul><li>负后发断言 记作 (?&lt;!...) 用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。 例如,表达式 (?&lt;!(T|t)he\s)(cat) 匹配 cat,且其前不跟着 The 或 the。</li></ul>
<div class="jb51code"><pre class="brush:js;">"(?&lt;!(T|t)he\s)(cat)" =&gt; The cat sat on cat.</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>正则表达式的使用</h2>
<p>判断字符串是否符合规则 test()</p>
<p>符合则返回true,否则返回false。</p>
<div class="jb51code"><pre class="brush:js;">var reg = /[^ab]/; // 规则:字符串中,除了a、b之外,还有没有其他的字符内容?
var str = "acb";

console.log(reg.test(str)); // 打印结果:true</pre></div>
<div class="jb51code"><pre class="brush:js;">        var reg = /[^0-9]/;// 规则:字符串中,除了数字之外,还有没有其他的内容?
        var str1 = "1991";
        var str2 = "199a1";

        console.log(reg.test(str1)); // 打印结果:false (如果字符串是 纯数字,则返回 false)
        console.log(reg.test(str2)); // 打印结果:true</pre></div>
<p class="maodian"><a name="_lab2_3_7"></a></p><h3>搜索第一个符合条件的字符串 search()</h3>
<p>search()【只会查找第一个】&mdash;&mdash;搜索字符串中是否含有指定内容。如果搜索到指定内容,则会返回第一次出现的索引;否则返回-1。</p>
<div class="jb51code"><pre class="brush:js;">        var str = "hello abc hello aec afc";
        // 搜索字符串中是否含有abc 或 aec 或 afc
        result = str.search(/ac/);
        console.log(result); // 打印结果:6</pre></div>
<p class="maodian"><a name="_lab2_3_8"></a></p><h3>搜索所有符合条件的字符串 match()</h3>
<p>从一个字符串中将符合条件的内容提取出来,封装到一个数组中返回(即使只查询到一个结果)。</p>
<p>默认情况下,match()方法只会找到第一个符合要求的内容,设置正则表达式为全局匹配模式,这样就会匹配到所有的内容,并以数组的形式返回。</p>
<p>可以为一个正则表达式设置多个匹配模式,且匹配模式的顺序无所谓。</p>
<div class="jb51code"><pre class="brush:js;">        var str = "1a2a3a4a5e6f7A8B9C";

        var result1 = str.match(//);   // 找到符合要求的第一个内容,然后返回
        var result2 = str.match(//g);// 设置为“全局匹配”模式,匹配字符串中 所有的小写字母
        var result3 = str.match(//gi); // 设置多个匹配模式,匹配字符串中 所有的字母(忽略大小写)

        console.log(result1); // 打印结果:["a"]
        console.log(result2); // 打印结果:["a", "a", "a", "a", "e", "f"]
        console.log(result3); // 打印结果:["a", "a", "a", "a", "e", "f", "A", "B", "C"]</pre></div>
<p class="maodian"><a name="_lab2_3_9"></a></p><h3>字符串拆分成数组 split()</h3>
<div class="jb51code"><pre class="brush:js;">        var str = "1a2b3c4d5e6f7g";
        var result = str.split(//); // 参数是一个正则表达式:表示所有字母
        console.log(result); //["1", "2", "3", "4", "5", "6", "7", ""]</pre></div>
<p class="maodian"><a name="_lab2_3_10"></a></p><h3>&nbsp;字符串替换 replace()</h3>
<p>默认只会替换第一个,如果需要替换全部符合条件的内容,可以设置正则表达式为全局匹配模式。</p>
<div class="jb51code"><pre class="brush:js;">let str1 = '2020/5/20'
console.log(str1.replace(/\//g,"-"));//得到 2020-5-20
   
var str2 = "Today is fine day,today is fine day !!!"
console.log(str2.replace("today","tomorrow"));//只能替换第一个today
console.log(str2.replace(/today/gi,"tomorrow")); //这里用到了正则,且为“全局匹配”模式,才能替换所有的today</pre></div>
<p class="maodian"><a name="_label3_3_10_0"></a></p><h4>过滤HTML标签&nbsp;</h4>
<div class="jb51code"><pre class="brush:js;">str.replace(/&lt;.*?&gt;/g, "") </pre></div>
<p class="maodian"><a name="_label3_3_10_1"></a></p><h4>去除空格</h4>
<div class="jb51code"><pre class="brush:js;">        str = str.replace(/^\s*/, ""); //去除开头的空格

        str = str.replace(/\s*$/, ""); //去除结尾的空格</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>常用正则表达式</h2>
<p>常用正则表达式大全</p>
<p><a href="https://www.jb51.net/article/72867.htm" target="_blank">最全的常用正则表达式大全&mdash;&mdash;包括校验数字、字符、一些特殊的需求等等</a></p>
<p>非零数字(只能输入数字,但值不能为0,可以是00,01等)</p>
<div class="jb51code"><pre class="brush:js;">/^({2}|0|)\d*$/</pre></div>
<p>验证保留两位小数的正整数或0</p>
<div class="jb51code"><pre class="brush:js;">/^(\d*|0)(\.\d{1,2})?$/</pre></div>
<p>验证手机号码,如13908653654</p>
<div class="jb51code"><pre class="brush:js;">/^(1{9})$/</pre></div>
<p>验证固定号码,如010-86551122或01086551122</p>
<div class="jb51code"><pre class="brush:js;">/^((0\d{2,3})[-]?)(\d{7,8})([-]?(\d{3,}))?$/</pre></div>
<p>&nbsp;验证电话号码&mdash;手机号码或固定号码,如13908653654或010-86551122或01086551122</p>
<div class="jb51code"><pre class="brush:js;">/(^(1{9})$)|(^((0\d{2,3})[-]?)(\d{7,8})([-]?(\d{3,}))?$)/</pre></div>
<p>验证一代身份证号码</p>
<div class="jb51code"><pre class="brush:js;">/^\d{8}(0\d|10|11|12)(\d|30|31)\d{3}$/</pre></div>
<p>验证二代身份证号码</p>
<div class="jb51code"><pre class="brush:js;">/^\d{6}(18|19|20)\d{2}(0\d|10|11|12)(\d|30|31)\d{3}[\dXx]$/</pre></div>
<p>验证通用身份证号码</p>
<div class="jb51code"><pre class="brush:js;">/(^\d{8}(0\d|10|11|12)(\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0\d|10|11|12)(\d|30|31)\d{3}(\d|X|x)$)/</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202210/202210090940233.jpg" /></p>
<p class="maodian"><a name="_label5"></a></p><h2>总结</h2>
頁: [1]
查看完整版本: 正则表达式RegExp语法与用法详解