作者:可乐加芬达61158 | 来源:互联网 | 2023-09-14 19:14
将输入的字符串按输入的正则表达式匹配并返回结果(仿正则表达式测试)
一、需求
-
最近做了一个很有意思的需求,基本功能和正则表达式的网页测试功能很相似,如:正则表达式在线测试 ,单独拿出来记录一下,为以后开发中遇到类似需求提供一些思路
-
需求1:用户可以输入一段正则表达式字符串和一段用于测试正则表达式匹配的字符串,这则表达式可以提供几个快捷修饰符,如:i、g、m、s,用户输入正则表达式后可以选择修饰符
-
需求2:根据输入的正则表达式字符串和选择的修饰符来生成一个完整的正则去匹配测试字符串并返回结果
-
大致效果如下所示:
二、解决
- 项目是
Vue3.x
+Element Plus
,需求1的部分很简单,利用ui
组件库提供的el-input
组件和el-checkbox
组件就能实现,这里需要注意的是复选框选中状态和未选中状态下的值,这里处理如下,部分非重要代码省略:
...
<el-inputtype&#61;"textarea"v-model&#61;"regStr"placeholder&#61;&#39;请先输入正则表达式&#39;/>
...
<el-inputtype&#61;"textarea"v-model&#61;"form.regTest"placeholder&#61;&#39;请先输入要测试的内容&#xff0c;然后点击"测试匹配"按钮&#39;/>
...
<el-button &#64;click&#61;"RegStrTest">el-button>
...
<div class&#61;"regexp-check-box"><el-checkboxv-model&#61;"reg.i"label&#61;"-i 忽略大小写"true-label&#61;&#39;i&#39;/><el-checkboxv-model&#61;"reg.m"label&#61;"-m 多行模式"true-label&#61;"m"/><el-checkboxv-model&#61;"reg.s"label&#61;"-s 包含换行符"true-label&#61;"s"/><el-checkboxv-model&#61;"reg.g"label&#61;"-g 全局匹配"true-label&#61;"g"/>
div>
...
<script setup>import { ref, reactive } from "vue"const reg &#61; reactive({i: &#39;i&#39;,m: &#39;m&#39;,s: &#39;s&#39;,g: &#39;g&#39;})const regStr &#61; ref(&#39;&#39;)const regTestStr &#61; ref(&#39;&#39;)const result &#61; ref(&#39;&#39;)const matchLocation &#61; ref(&#39;&#39;)
script>
...
- 接下来开始实现功能模块&#xff0c;因为这里输入的正则表达式的类型是字符串&#xff0c;所以需要将字符串进行一次类型转换&#xff0c;转为正则表达式&#xff0c;这里要用到两种字符串转为正则的方法分别是
new RegExp()
和eval()
&#xff0c;复选框由于只通过true-label
属性定义了选中状态下的值&#xff0c;未选中状态下的值为undefined
&#xff0c;结合上述代码&#xff0c;实现正则表达式匹配功能代码如下&#xff1a;
<script setup>...const RegStrTest &#61; () &#61;> {if (regStr.value && regTestStr.value) {let temp &#61; &#39;/&#39; &#43; regStr.value &#43; &#39;/&#39;for (let key in reg) {if (reg[key]) {temp &#43;&#61; reg[key]}}let regx &#61; eval(temp)regTestStr.value.replace(regx, function (match){result.value &#43;&#61; match &#43; &#39; &#39;matchLocation.value &#61; regTestStr.value.indexOf(match)})}}...
script>
到这里就完成了&#xff0c;希望能帮到你&#x1f308;