登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
轻量养虾,开箱即用!低 Token + 稳定算力,Gitee & 模力方舟联合出品的 PocketClaw 正式开售!点击了解详情~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
47
Fork
22
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
开发画像分析
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
正则表达式是什么,有哪些应用场景?
待办的
#IAG9PF
陌生人
拥有者
创建于
2024-07-29 16:07
<h2>一、是什么</h2> <p>正则表达式是一种用来匹配字符串的强有力的武器</p> <p>它的设计思想是用一种描述性的语言定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的</p> <p>在 <code>JavaScript</code>中,正则表达式也是对象,构建正则表达式有两种方式:</p> <ol> <li>字面量创建,其由包含在斜杠之间的模式组成</li> </ol> <pre><code class="language-js">const re = /\d+/g;</code></pre> <ol start="2"> <li>调用<code>RegExp</code>对象的构造函数</li> </ol> <pre><code class="language-js">const re = new RegExp("\\d+","g"); const rul = "\\d+" const re1 = new RegExp(rul,"g");</code></pre> <p>使用构建函数创建,第一个参数可以是一个变量,遇到特殊字符<code>\</code>需要使用<code>\\</code>进行转义</p> <h2>二、匹配规则</h2> <p>常见的校验规则如下:</p> <table> <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>匹配前一个表达式 0 次或多次</td> </tr> <tr> <td>+</td> <td>匹配前面一个表达式 1 次或者多次。等价于 <code>{1,}</code></td> </tr> <tr> <td>?</td> <td>匹配前面一个表达式 0 次或者 1 次。等价于<code>{0,1}</code></td> </tr> <tr> <td>.</td> <td>默认匹配除换行符之外的任何单个字符</td> </tr> <tr> <td>x(?=y)</td> <td>匹配'x'仅仅当'x'后面跟着'y'。这种叫做先行断言</td> </tr> <tr> <td>(?<=y)x</td> <td>匹配'x'仅当'x'前面是'y'.这种叫做后行断言</td> </tr> <tr> <td>x(?!y)</td> <td>仅仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找</td> </tr> <tr> <td>(?<!<em>y</em>)<em>x</em></td> <td>仅仅当'x'前面不是'y'时匹配'x',这被称为反向否定查找</td> </tr> <tr> <td>x|y</td> <td>匹配‘x’或者‘y’</td> </tr> <tr> <td>{n}</td> <td>n 是一个正整数,匹配了前面一个字符刚好出现了 n 次</td> </tr> <tr> <td>{n,}</td> <td>n是一个正整数,匹配前一个字符至少出现了n次</td> </tr> <tr> <td>{n,m}</td> <td>n 和 m 都是整数。匹配前面的字符至少n次,最多m次</td> </tr> <tr> <td>[xyz]</td> <td>一个字符集合。匹配方括号中的任意字符</td> </tr> <tr> <td>[^xyz]</td> <td>匹配任何没有包含在方括号中的字符</td> </tr> <tr> <td>\b</td> <td>匹配一个词的边界,例如在字母和空格之间</td> </tr> <tr> <td>\B</td> <td>匹配一个非单词边界</td> </tr> <tr> <td>\d</td> <td>匹配一个数字</td> </tr> <tr> <td>\D</td> <td>匹配一个非数字字符</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>\s</td> <td>匹配一个空白字符,包括空格、制表符、换页符和换行符</td> </tr> <tr> <td>\S</td> <td>匹配一个非空白字符</td> </tr> <tr> <td>\w</td> <td>匹配一个单字字符(字母、数字或者下划线)</td> </tr> <tr> <td>\W</td> <td>匹配一个非单字字符</td> </tr> </tbody> </table> <h3>正则表达式标记</h3> <table> <thead> <tr> <th style="text-align: left;">标志</th> <th style="text-align: left;">描述</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><code>g</code></td> <td style="text-align: left;">全局搜索。</td> </tr> <tr> <td style="text-align: left;"><code>i</code></td> <td style="text-align: left;">不区分大小写搜索。</td> </tr> <tr> <td style="text-align: left;"><code>m</code></td> <td style="text-align: left;">多行搜索。</td> </tr> <tr> <td style="text-align: left;"><code>s</code></td> <td style="text-align: left;">允许 <code>.</code> 匹配换行符。</td> </tr> <tr> <td style="text-align: left;"><code>u</code></td> <td style="text-align: left;">使用<code>unicode</code>码的模式进行匹配。</td> </tr> <tr> <td style="text-align: left;"><code>y</code></td> <td style="text-align: left;">执行“粘性(<code>sticky</code>)”搜索,匹配从目标字符串的当前位置开始。</td> </tr> </tbody> </table> <p>使用方法如下:</p> <pre><code class="language-js">var re = /pattern/flags; var re = new RegExp("pattern", "flags");</code></pre> <p>在了解下正则表达式基本的之外,还可以掌握几个正则表达式的特性:</p> <h3>贪婪模式</h3> <p>在了解贪婪模式前,首先举个例子:</p> <pre><code class="language-js">const reg = /ab{1,3}c/</code></pre> <p>在匹配过程中,尝试可能的顺序是从多往少的方向去尝试。首先会尝试<code>bbb</code>,然后再看整个正则是否能匹配。不能匹配时,吐出一个<code>b</code>,即在<code>bb</code>的基础上,再继续尝试,以此重复</p> <p>如果多个贪婪量词挨着,则深度优先搜索</p> <pre><code class="language-js">const string = "12345"; const regx = /(\d{1,3})(\d{1,3})/; console.log( string.match(reg) ); // => ["12345", "123", "45", index: 0, input: "12345"]</code></pre> <p>其中,前面的<code>\d{1,3}</code>匹配的是"123",后面的<code>\d{1,3}</code>匹配的是"45"</p> <h3>懒惰模式</h3> <p>惰性量词就是在贪婪量词后面加个问号。表示尽可能少的匹配</p> <pre><code class="language-js">var string = "12345"; var regex = /(\d{1,3}?)(\d{1,3})/; console.log( string.match(regex) ); // => ["1234", "1", "234", index: 0, input: "12345"]</code></pre> <p>其中<code>\d{1,3}?</code>只匹配到一个字符"1",而后面的<code>\d{1,3}</code>匹配了"234"</p> <h3>分组</h3> <p>分组主要是用过<code>()</code>进行实现,比如<code>beyond{3}</code>,是匹配<code>d</code>字母3次。而<code>(beyond){3}</code>是匹配<code>beyond</code>三次</p> <p>在<code>()</code>内使用<code>|</code>达到或的效果,如<code>(abc | xxx)</code>可以匹配<code>abc</code>或者<code>xxx</code></p> <p>反向引用,巧用<code>$</code>分组捕获</p> <pre><code class="language-js">let str = "John Smith"; // 交换名字和姓氏 console.log(str.replace(/(john) (smith)/i, '$2, $1')) // Smith, John</code></pre> <h2>三、匹配方法</h2> <p>正则表达式常被用于某些方法,我们可以分成两类:</p> <ul> <li>字符串(str)方法:<code>match</code>、<code>matchAll</code>、<code>search</code>、<code>replace</code>、<code>split</code></li> <li>正则对象下(regexp)的方法:<code>test</code>、<code>exec</code></li> </ul> <table> <thead> <tr> <th style="text-align: left;">方法</th> <th style="text-align: left;">描述</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;">exec</td> <td style="text-align: left;">一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null)。</td> </tr> <tr> <td style="text-align: left;">test</td> <td style="text-align: left;">一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false。</td> </tr> <tr> <td style="text-align: left;">match</td> <td style="text-align: left;">一个在字符串中执行查找匹配的String方法,它返回一个数组,在未匹配到时会返回 null。</td> </tr> <tr> <td style="text-align: left;">matchAll</td> <td style="text-align: left;">一个在字符串中执行查找所有匹配的String方法,它返回一个迭代器(iterator)。</td> </tr> <tr> <td style="text-align: left;">search</td> <td style="text-align: left;">一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。</td> </tr> <tr> <td style="text-align: left;">replace</td> <td style="text-align: left;">一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。</td> </tr> <tr> <td style="text-align: left;">split</td> <td style="text-align: left;">一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 <code>String</code> 方法。</td> </tr> </tbody> </table> <h3>str.match(regexp)</h3> <p><code>str.match(regexp)</code> 方法在字符串 <code>str</code> 中找到匹配 <code>regexp</code> 的字符</p> <p>如果 <code>regexp</code> 不带有 <code>g</code> 标记,则它以数组的形式返回第一个匹配项,其中包含分组和属性 <code>index</code>(匹配项的位置)、<code>input</code>(输入字符串,等于 <code>str</code>)</p> <pre><code class="language-js">let str = "I love JavaScript"; let result = str.match(/Java(Script)/); console.log( result[0] ); // JavaScript(完全匹配) console.log( result[1] ); // Script(第一个分组) console.log( result.length ); // 2 // 其他信息: console.log( result.index ); // 7(匹配位置) console.log( result.input ); // I love JavaScript(源字符串)</code></pre> <p>如果 <code>regexp</code> 带有 <code>g</code> 标记,则它将所有匹配项的数组作为字符串返回,而不包含分组和其他详细信息</p> <pre><code class="language-js">let str = "I love JavaScript"; let result = str.match(/Java(Script)/g); console.log( result[0] ); // JavaScript console.log( result.length ); // 1</code></pre> <p>如果没有匹配项,则无论是否带有标记 <code>g</code> ,都将返回 <code>null</code></p> <pre><code class="language-js">let str = "I love JavaScript"; let result = str.match(/HTML/); console.log(result); // null</code></pre> <h3>str.matchAll(regexp)</h3> <p>返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器</p> <pre><code class="language-js">const regexp = /t(e)(st(\d?))/g; const str = 'test1test2'; const array = [...str.matchAll(regexp)]; console.log(array[0]); // expected output: Array ["test1", "e", "st1", "1"] console.log(array[1]); // expected output: Array ["test2", "e", "st2", "2"]</code></pre> <h3>str.search(regexp)</h3> <p>返回第一个匹配项的位置,如果未找到,则返回 <code>-1</code></p> <pre><code class="language-js">let str = "A drop of ink may make a million think"; console.log( str.search( /ink/i ) ); // 10(第一个匹配位置)</code></pre> <p>这里需要注意的是,<code>search</code> 仅查找第一个匹配项</p> <h2>str.replace(regexp)</h2> <p>替换与正则表达式匹配的子串,并返回替换后的字符串。在不设置全局匹配<code>g</code>的时候,只替换第一个匹配成功的字符串片段</p> <pre><code class="language-js">const reg1=/javascript/i; const reg2=/javascript/ig; console.log('hello Javascript Javascript Javascript'.replace(reg1,'js')); //hello js Javascript Javascript console.log('hello Javascript Javascript Javascript'.replace(reg2,'js')); //hello js js js</code></pre> <h3>str.split(regexp)</h3> <p>使用正则表达式(或子字符串)作为分隔符来分割字符串</p> <pre><code class="language-js">console.log('12, 34, 56'.split(/,\s*/)) // 数组 ['12', '34', '56']</code></pre> <h3>regexp.exec(str)</h3> <p><code>regexp.exec(str)</code> 方法返回字符串 <code>str</code> 中的 <code>regexp</code> 匹配项,与以前的方法不同,它是在正则表达式而不是字符串上调用的</p> <p>根据正则表达式是否带有标志 <code>g</code>,它的行为有所不同</p> <p>如果没有 <code>g</code>,那么 <code>regexp.exec(str)</code> 返回的第一个匹配与 <code>str.match(regexp)</code> 完全相同</p> <p>如果有标记 <code>g</code>,调用 <code>regexp.exec(str)</code> 会返回第一个匹配项,并将紧随其后的位置保存在属性<code>regexp.lastIndex</code> 中。 下一次同样的调用会从位置 <code>regexp.lastIndex</code> 开始搜索,返回下一个匹配项,并将其后的位置保存在 <code>regexp.lastIndex</code> 中</p> <pre><code class="language-js">let str = 'More about JavaScript at https://javascript.info'; let regexp = /javascript/ig; let result; while (result = regexp.exec(str)) { console.log( `Found ${result[0]} at position ${result.index}` ); // Found JavaScript at position 11 // Found javascript at position 33 }</code></pre> <h3>regexp.test(str)</h3> <p>查找匹配项,然后返回 <code>true/false</code> 表示是否存在</p> <pre><code class="language-js">let str = "I love JavaScript"; // 这两个测试相同 console.log( /love/i.test(str) ); // true</code></pre> <h2>四、应用场景</h2> <p>通过上面的学习,我们对正则表达式有了一定的了解</p> <p>下面再来看看正则表达式一些案例场景:</p> <p>验证QQ合法性(5~15位、全是数字、不以0开头):</p> <pre><code class="language-js">const reg = /^[1-9][0-9]{4,14}$/ const isvalid = patrn.exec(s)</code></pre> <p>校验用户账号合法性(只能输入5-20个以字母开头、可带数字、“_”、“.”的字串):</p> <pre><code class="language-js">var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/; const isvalid = patrn.exec(s)</code></pre> <p>将<code>url</code>参数解析为对象</p> <pre><code class="language-js">const protocol = '(?<protocol>https?:)'; const host = '(?<host>(?<hostname>[^/#?:]+)(?::(?<port>\\d+))?)'; const path = '(?<pathname>(?:\\/[^/#?]+)*\\/?)'; const search = '(?<search>(?:\\?[^#]*)?)'; const hash = '(?<hash>(?:#.*)?)'; const reg = new RegExp(`^${protocol}\/\/${host}${path}${search}${hash}$`); function execURL(url){ const result = reg.exec(url); if(result){ result.groups.port = result.groups.port || ''; return result.groups; } return { protocol:'',host:'',hostname:'',port:'', pathname:'',search:'',hash:'', }; } console.log(execURL('https://localhost:8080/?a=b#xxxx')); protocol: "https:" host: "localhost:8080" hostname: "localhost" port: "8080" pathname: "/" search: "?a=b" hash: "#xxxx"</code></pre> <p>再将上面的<code>search</code>和<code>hash</code>进行解析</p> <pre><code class="language-js">function execUrlParams(str){ str = str.replace(/^[#?&]/,''); const result = {}; if(!str){ //如果正则可能配到空字符串,极有可能造成死循环,判断很重要 return result; } const reg = /(?:^|&)([^&=]*)=?([^&]*?)(?=&|$)/y let exec = reg.exec(str); while(exec){ result[exec[1]] = exec[2]; exec = reg.exec(str); } return result; } console.log(execUrlParams('#'));// {} console.log(execUrlParams('##'));//{'#':''} console.log(execUrlParams('?q=3606&src=srp')); //{q: "3606", src: "srp"} console.log(execUrlParams('test=a=b=c&&==&a='));//{test: "a=b=c", "": "=", a: ""}</code></pre>
<h2>一、是什么</h2> <p>正则表达式是一种用来匹配字符串的强有力的武器</p> <p>它的设计思想是用一种描述性的语言定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的</p> <p>在 <code>JavaScript</code>中,正则表达式也是对象,构建正则表达式有两种方式:</p> <ol> <li>字面量创建,其由包含在斜杠之间的模式组成</li> </ol> <pre><code class="language-js">const re = /\d+/g;</code></pre> <ol start="2"> <li>调用<code>RegExp</code>对象的构造函数</li> </ol> <pre><code class="language-js">const re = new RegExp("\\d+","g"); const rul = "\\d+" const re1 = new RegExp(rul,"g");</code></pre> <p>使用构建函数创建,第一个参数可以是一个变量,遇到特殊字符<code>\</code>需要使用<code>\\</code>进行转义</p> <h2>二、匹配规则</h2> <p>常见的校验规则如下:</p> <table> <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>匹配前一个表达式 0 次或多次</td> </tr> <tr> <td>+</td> <td>匹配前面一个表达式 1 次或者多次。等价于 <code>{1,}</code></td> </tr> <tr> <td>?</td> <td>匹配前面一个表达式 0 次或者 1 次。等价于<code>{0,1}</code></td> </tr> <tr> <td>.</td> <td>默认匹配除换行符之外的任何单个字符</td> </tr> <tr> <td>x(?=y)</td> <td>匹配'x'仅仅当'x'后面跟着'y'。这种叫做先行断言</td> </tr> <tr> <td>(?<=y)x</td> <td>匹配'x'仅当'x'前面是'y'.这种叫做后行断言</td> </tr> <tr> <td>x(?!y)</td> <td>仅仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找</td> </tr> <tr> <td>(?<!<em>y</em>)<em>x</em></td> <td>仅仅当'x'前面不是'y'时匹配'x',这被称为反向否定查找</td> </tr> <tr> <td>x|y</td> <td>匹配‘x’或者‘y’</td> </tr> <tr> <td>{n}</td> <td>n 是一个正整数,匹配了前面一个字符刚好出现了 n 次</td> </tr> <tr> <td>{n,}</td> <td>n是一个正整数,匹配前一个字符至少出现了n次</td> </tr> <tr> <td>{n,m}</td> <td>n 和 m 都是整数。匹配前面的字符至少n次,最多m次</td> </tr> <tr> <td>[xyz]</td> <td>一个字符集合。匹配方括号中的任意字符</td> </tr> <tr> <td>[^xyz]</td> <td>匹配任何没有包含在方括号中的字符</td> </tr> <tr> <td>\b</td> <td>匹配一个词的边界,例如在字母和空格之间</td> </tr> <tr> <td>\B</td> <td>匹配一个非单词边界</td> </tr> <tr> <td>\d</td> <td>匹配一个数字</td> </tr> <tr> <td>\D</td> <td>匹配一个非数字字符</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>\s</td> <td>匹配一个空白字符,包括空格、制表符、换页符和换行符</td> </tr> <tr> <td>\S</td> <td>匹配一个非空白字符</td> </tr> <tr> <td>\w</td> <td>匹配一个单字字符(字母、数字或者下划线)</td> </tr> <tr> <td>\W</td> <td>匹配一个非单字字符</td> </tr> </tbody> </table> <h3>正则表达式标记</h3> <table> <thead> <tr> <th style="text-align: left;">标志</th> <th style="text-align: left;">描述</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><code>g</code></td> <td style="text-align: left;">全局搜索。</td> </tr> <tr> <td style="text-align: left;"><code>i</code></td> <td style="text-align: left;">不区分大小写搜索。</td> </tr> <tr> <td style="text-align: left;"><code>m</code></td> <td style="text-align: left;">多行搜索。</td> </tr> <tr> <td style="text-align: left;"><code>s</code></td> <td style="text-align: left;">允许 <code>.</code> 匹配换行符。</td> </tr> <tr> <td style="text-align: left;"><code>u</code></td> <td style="text-align: left;">使用<code>unicode</code>码的模式进行匹配。</td> </tr> <tr> <td style="text-align: left;"><code>y</code></td> <td style="text-align: left;">执行“粘性(<code>sticky</code>)”搜索,匹配从目标字符串的当前位置开始。</td> </tr> </tbody> </table> <p>使用方法如下:</p> <pre><code class="language-js">var re = /pattern/flags; var re = new RegExp("pattern", "flags");</code></pre> <p>在了解下正则表达式基本的之外,还可以掌握几个正则表达式的特性:</p> <h3>贪婪模式</h3> <p>在了解贪婪模式前,首先举个例子:</p> <pre><code class="language-js">const reg = /ab{1,3}c/</code></pre> <p>在匹配过程中,尝试可能的顺序是从多往少的方向去尝试。首先会尝试<code>bbb</code>,然后再看整个正则是否能匹配。不能匹配时,吐出一个<code>b</code>,即在<code>bb</code>的基础上,再继续尝试,以此重复</p> <p>如果多个贪婪量词挨着,则深度优先搜索</p> <pre><code class="language-js">const string = "12345"; const regx = /(\d{1,3})(\d{1,3})/; console.log( string.match(reg) ); // => ["12345", "123", "45", index: 0, input: "12345"]</code></pre> <p>其中,前面的<code>\d{1,3}</code>匹配的是"123",后面的<code>\d{1,3}</code>匹配的是"45"</p> <h3>懒惰模式</h3> <p>惰性量词就是在贪婪量词后面加个问号。表示尽可能少的匹配</p> <pre><code class="language-js">var string = "12345"; var regex = /(\d{1,3}?)(\d{1,3})/; console.log( string.match(regex) ); // => ["1234", "1", "234", index: 0, input: "12345"]</code></pre> <p>其中<code>\d{1,3}?</code>只匹配到一个字符"1",而后面的<code>\d{1,3}</code>匹配了"234"</p> <h3>分组</h3> <p>分组主要是用过<code>()</code>进行实现,比如<code>beyond{3}</code>,是匹配<code>d</code>字母3次。而<code>(beyond){3}</code>是匹配<code>beyond</code>三次</p> <p>在<code>()</code>内使用<code>|</code>达到或的效果,如<code>(abc | xxx)</code>可以匹配<code>abc</code>或者<code>xxx</code></p> <p>反向引用,巧用<code>$</code>分组捕获</p> <pre><code class="language-js">let str = "John Smith"; // 交换名字和姓氏 console.log(str.replace(/(john) (smith)/i, '$2, $1')) // Smith, John</code></pre> <h2>三、匹配方法</h2> <p>正则表达式常被用于某些方法,我们可以分成两类:</p> <ul> <li>字符串(str)方法:<code>match</code>、<code>matchAll</code>、<code>search</code>、<code>replace</code>、<code>split</code></li> <li>正则对象下(regexp)的方法:<code>test</code>、<code>exec</code></li> </ul> <table> <thead> <tr> <th style="text-align: left;">方法</th> <th style="text-align: left;">描述</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;">exec</td> <td style="text-align: left;">一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null)。</td> </tr> <tr> <td style="text-align: left;">test</td> <td style="text-align: left;">一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false。</td> </tr> <tr> <td style="text-align: left;">match</td> <td style="text-align: left;">一个在字符串中执行查找匹配的String方法,它返回一个数组,在未匹配到时会返回 null。</td> </tr> <tr> <td style="text-align: left;">matchAll</td> <td style="text-align: left;">一个在字符串中执行查找所有匹配的String方法,它返回一个迭代器(iterator)。</td> </tr> <tr> <td style="text-align: left;">search</td> <td style="text-align: left;">一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。</td> </tr> <tr> <td style="text-align: left;">replace</td> <td style="text-align: left;">一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。</td> </tr> <tr> <td style="text-align: left;">split</td> <td style="text-align: left;">一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 <code>String</code> 方法。</td> </tr> </tbody> </table> <h3>str.match(regexp)</h3> <p><code>str.match(regexp)</code> 方法在字符串 <code>str</code> 中找到匹配 <code>regexp</code> 的字符</p> <p>如果 <code>regexp</code> 不带有 <code>g</code> 标记,则它以数组的形式返回第一个匹配项,其中包含分组和属性 <code>index</code>(匹配项的位置)、<code>input</code>(输入字符串,等于 <code>str</code>)</p> <pre><code class="language-js">let str = "I love JavaScript"; let result = str.match(/Java(Script)/); console.log( result[0] ); // JavaScript(完全匹配) console.log( result[1] ); // Script(第一个分组) console.log( result.length ); // 2 // 其他信息: console.log( result.index ); // 7(匹配位置) console.log( result.input ); // I love JavaScript(源字符串)</code></pre> <p>如果 <code>regexp</code> 带有 <code>g</code> 标记,则它将所有匹配项的数组作为字符串返回,而不包含分组和其他详细信息</p> <pre><code class="language-js">let str = "I love JavaScript"; let result = str.match(/Java(Script)/g); console.log( result[0] ); // JavaScript console.log( result.length ); // 1</code></pre> <p>如果没有匹配项,则无论是否带有标记 <code>g</code> ,都将返回 <code>null</code></p> <pre><code class="language-js">let str = "I love JavaScript"; let result = str.match(/HTML/); console.log(result); // null</code></pre> <h3>str.matchAll(regexp)</h3> <p>返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器</p> <pre><code class="language-js">const regexp = /t(e)(st(\d?))/g; const str = 'test1test2'; const array = [...str.matchAll(regexp)]; console.log(array[0]); // expected output: Array ["test1", "e", "st1", "1"] console.log(array[1]); // expected output: Array ["test2", "e", "st2", "2"]</code></pre> <h3>str.search(regexp)</h3> <p>返回第一个匹配项的位置,如果未找到,则返回 <code>-1</code></p> <pre><code class="language-js">let str = "A drop of ink may make a million think"; console.log( str.search( /ink/i ) ); // 10(第一个匹配位置)</code></pre> <p>这里需要注意的是,<code>search</code> 仅查找第一个匹配项</p> <h2>str.replace(regexp)</h2> <p>替换与正则表达式匹配的子串,并返回替换后的字符串。在不设置全局匹配<code>g</code>的时候,只替换第一个匹配成功的字符串片段</p> <pre><code class="language-js">const reg1=/javascript/i; const reg2=/javascript/ig; console.log('hello Javascript Javascript Javascript'.replace(reg1,'js')); //hello js Javascript Javascript console.log('hello Javascript Javascript Javascript'.replace(reg2,'js')); //hello js js js</code></pre> <h3>str.split(regexp)</h3> <p>使用正则表达式(或子字符串)作为分隔符来分割字符串</p> <pre><code class="language-js">console.log('12, 34, 56'.split(/,\s*/)) // 数组 ['12', '34', '56']</code></pre> <h3>regexp.exec(str)</h3> <p><code>regexp.exec(str)</code> 方法返回字符串 <code>str</code> 中的 <code>regexp</code> 匹配项,与以前的方法不同,它是在正则表达式而不是字符串上调用的</p> <p>根据正则表达式是否带有标志 <code>g</code>,它的行为有所不同</p> <p>如果没有 <code>g</code>,那么 <code>regexp.exec(str)</code> 返回的第一个匹配与 <code>str.match(regexp)</code> 完全相同</p> <p>如果有标记 <code>g</code>,调用 <code>regexp.exec(str)</code> 会返回第一个匹配项,并将紧随其后的位置保存在属性<code>regexp.lastIndex</code> 中。 下一次同样的调用会从位置 <code>regexp.lastIndex</code> 开始搜索,返回下一个匹配项,并将其后的位置保存在 <code>regexp.lastIndex</code> 中</p> <pre><code class="language-js">let str = 'More about JavaScript at https://javascript.info'; let regexp = /javascript/ig; let result; while (result = regexp.exec(str)) { console.log( `Found ${result[0]} at position ${result.index}` ); // Found JavaScript at position 11 // Found javascript at position 33 }</code></pre> <h3>regexp.test(str)</h3> <p>查找匹配项,然后返回 <code>true/false</code> 表示是否存在</p> <pre><code class="language-js">let str = "I love JavaScript"; // 这两个测试相同 console.log( /love/i.test(str) ); // true</code></pre> <h2>四、应用场景</h2> <p>通过上面的学习,我们对正则表达式有了一定的了解</p> <p>下面再来看看正则表达式一些案例场景:</p> <p>验证QQ合法性(5~15位、全是数字、不以0开头):</p> <pre><code class="language-js">const reg = /^[1-9][0-9]{4,14}$/ const isvalid = patrn.exec(s)</code></pre> <p>校验用户账号合法性(只能输入5-20个以字母开头、可带数字、“_”、“.”的字串):</p> <pre><code class="language-js">var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/; const isvalid = patrn.exec(s)</code></pre> <p>将<code>url</code>参数解析为对象</p> <pre><code class="language-js">const protocol = '(?<protocol>https?:)'; const host = '(?<host>(?<hostname>[^/#?:]+)(?::(?<port>\\d+))?)'; const path = '(?<pathname>(?:\\/[^/#?]+)*\\/?)'; const search = '(?<search>(?:\\?[^#]*)?)'; const hash = '(?<hash>(?:#.*)?)'; const reg = new RegExp(`^${protocol}\/\/${host}${path}${search}${hash}$`); function execURL(url){ const result = reg.exec(url); if(result){ result.groups.port = result.groups.port || ''; return result.groups; } return { protocol:'',host:'',hostname:'',port:'', pathname:'',search:'',hash:'', }; } console.log(execURL('https://localhost:8080/?a=b#xxxx')); protocol: "https:" host: "localhost:8080" hostname: "localhost" port: "8080" pathname: "/" search: "?a=b" hash: "#xxxx"</code></pre> <p>再将上面的<code>search</code>和<code>hash</code>进行解析</p> <pre><code class="language-js">function execUrlParams(str){ str = str.replace(/^[#?&]/,''); const result = {}; if(!str){ //如果正则可能配到空字符串,极有可能造成死循环,判断很重要 return result; } const reg = /(?:^|&)([^&=]*)=?([^&]*?)(?=&|$)/y let exec = reg.exec(str); while(exec){ result[exec[1]] = exec[2]; exec = reg.exec(str); } return result; } console.log(execUrlParams('#'));// {} console.log(execUrlParams('##'));//{'#':''} console.log(execUrlParams('?q=3606&src=srp')); //{q: "3606", src: "srp"} console.log(execUrlParams('test=a=b=c&&==&a='));//{test: "a=b=c", "": "=", a: ""}</code></pre>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Html/JS/CSS
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
分支 (
-
)
标签 (
-
)
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册