几个问题,想帮我解答一下,可以的话看看代码有没有可以更完善的地方

来源:4-7 完善测试工具

Bravura

2019-12-11 19:43:43

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>正则表达式测试工具</title>
    <style>
        dl,
        dd {
            padding: 0;
            margin: 0;
        }

        .wrap {
            width: 1000px;
            margin: 100px auto;
        }

        #regexp {
            float: left;
            width: 650px;

        }

        .title {

            color: #777;
            font-size: 24px;
            text-align: center;
        }

        #regexp .textbox {
            width: 638px;
            height: 150px;
            border: 1px solid #ccc;
            border-radius: 5px;
            padding: 5px;
            resize: none;
        }

        #regexp .readonly {
            background-color: #eee;
        }

        #regexp .textfidel {
            width: 215px;
            padding: 5xp;
            border: 1 solid #ccc;
        }

        #reglist {
            float: right;
            width: 320px;
            border: 1px solid #ccc;
            border-radius: 5px;
            background-color: #f5f5f5;
            padding: 20px 0;
        }

        #reglist dt {
            margin-bottom: 10px;
            text-indent: 20px;
            color: #999;
            font-size: 18px;
            font-weight: bold;
        }

        #reglist dd {
            height: 40px;
            line-height: 40px;
            text-indent: 20px;

        }

        #reglist a {
            display: block;
            color: #08c;
            text-decoration: none;
        }

        #reglist a:hover {
            color: #005580;
            background-color: #eee;
        }
    </style>
</head>

<body>
    <div class="wrap" id="wrap">
        <h1 class="title">正则表达式测试工具</h1>
        <div id="regexp">
            <h1 class="title">正则表达式测试工具</h1>
            <textarea id="usertext" class="textbox" placeholder="在此处输入比配的文本"></textarea>
            <p>
                正则表达式:<input type="text" id="userRegExp" class="textfield" type="text" placeholder="在此处输入正则表达式" />
                <input type="checkbox" class="userModifier" value="i" />忽略大小写
                <input type="checkbox" class="userModifier" value="g" />全局匹配
                <input type="checkbox" class="userModifier" value="m" />多行匹配
                <input type="button" value="测试匹配" id="matchingBtn">
            </p>
                匹配结果:<div id="matchingResult" class="textbox readonly">
            </div>

            <p>
                替换文本:<input type="text" id="userReplace" class="textReplace" type="text" />
                         <input type="button" value="点击替换" id="replaceBtn">
            </p>
            匹配结果:
            <div id="replaceResult" class="textbox readonly"></div>
        </div>


        <dl id="reglist">
            <dt>常用正则表达式</dt>
            <dd><a href="javascript:;" class="regexplist" title=" [\u4e00-\u9fa5]*">匹配中文字符</a></dd>
            <dd><a href="javascript:;" class="regexplist" title="[1-9]\d{4,}$">qq</a></dd>
            <dd><a href="javascript:;" class="regexplist" title="^[\u4e00-\u9fa5a-zA-Z0-9_]{2,8}$">昵称</a></dd>
            <dd><a href="javascript:;" class="regexplist" title="">匹配中文字符</a></dd>
            <dd><a href="javascript:;" class="regexplist" title="">匹配中文字符</a></dd>
            <dd><a href="javascript:;" class="regexplist" title="">匹配中文字符</a></dd>
            <dd><a href="javascript:;" class="regexplist" title="">匹配中文字符</a></dd>
            <dd><a href="javascript:;" class="regexplist" title="">匹配中文字符</a></dd>
        </dl>
    </div>



    <script>
        //获取 节点

        var wrap = document.getElementById("wrap");   
        var wrapElems = {
            userText: wrap.querySelector("#usertext"),
            userRegExp: wrap.querySelector("#userRegExp"),
            userModifier: wrap.querySelectorAll(".userModifier"),
            matchingBtn: wrap.querySelector("#matchingBtn"),
            matchingResult: wrap.querySelector("#matchingResult"),
            userReplace: wrap.querySelector("#userReplace"),
            replaceBtn: wrap.querySelector("#replaceBtn"),
            replaceResult: wrap.querySelector("#replaceResult"),
            reglist: wrap.querySelector("#reglist").querySelectorAll(".regexplist")      
        };
        var modifier = "";

       

        
        //获得匹配模式modifier

        for (var i = 0; i < wrapElems.userModifier.length; i++) {
            wrapElems.userModifier[i].onclick = function () {
                modifier = "";
                for (var j = 0; j < wrapElems.userModifier.length; j++) {
                    if (wrapElems.userModifier[j].checked) {
                        
                        modifier = modifier + wrapElems.userModifier[j].value;
                    }
                }

            }
        }


        //文本填写错误提示
        function errorTip(userTextValue, userRegExpValue, userReplaceValue) {
            if (!userTextValue) {
                alert("请输入带匹配的文本");
                wrapElems.userText.focus();
                return false;
            }
            if (!userRegExpValue) {
                alert("请输入正则表达式");
                wrapElems.userRegExp.focus();
                return false;
            }
            if (!userReplaceValue) {
                alert("请输入替换本文");
                wrapElems.userRegExp.focus();
                return false;
            }
            return true;
        }

        

        //正则btn点击事件
        wrapElems.matchingBtn.onclick = function () {
            if (!errorTip(wrapElems.userText.value, wrapElems.userRegExp.value, 1)) return;
            //显示匹配是否成功
            var p = new RegExp(wrapElems.userRegExp.value, modifier);
            wrapElems.matchingResult.innerHTML = p.exec(wrapElems.userText.value) ? wrapElems.userText.value.replace(p, '<strong style="background-color:yellow;">' + p.exec(wrapElems.userText.value) + '</strong') : "没有匹配";
        }


        //替换btn点击事件
        wrapElems.replaceBtn.onclick = function () {
            if (!errorTip(wrapElems.userText.value, wrapElems.userRegExp.value, wrapElems.userReplace.value)) return;
            //显示匹配是否成功
            var p = new RegExp(userRegExp.value, modifier);
            wrapElems.replaceResult.innerHTML = wrapElems.userText.value.replace(p, wrapElems.userReplace.value);
        }

        //点击正则表达式
        for (var i = 0; i < wrapElems.reglist.length; i++) {
            wrapElems.reglist[i].onclick = function () {
                wrapElems.userRegExp.value = this.title;
            }
        }


    </script>
</body>

</html>

第一个是点击右边匹配文字字符没反应了,显示没有匹配

http://img.mukewang.com/climg/5df0d4c40952974405540378.jpg

第二个就是我选择全局匹配是都不成功,提示没有匹配

http://img.mukewang.com/climg/5df0d4f70910825e05540358.jpg

第三个如图所示

http://img.mukewang.com/climg/5df0d637095c64cc05540326.jpg

写回答

1回答

好帮手慕夭夭

2019-12-12

同学你好,问题解答如下:

1.老师这边测试是可以匹配的,如下:

http://img.mukewang.com/climg/5df19d7b0907265004810319.jpg

同学看看是不是正则表达式前面有空格,删除重新试一试:

正则为:[\u4e00-\u9fa5]*

http://img.mukewang.com/climg/5df19da209a148ac02350062.jpg

2. 老师这边测试着结果是null ,这是exec的问题,在全局匹配下,exec一次只会匹配符合条件的一项,每次调用则会在字符串中继续寻找,例如asd 第一次匹配a 第二次匹配s,所以第二次匹配的时候就是null。

http://img.mukewang.com/climg/5df1a8be09fc261206930323.jpg

http://img.mukewang.com/climg/5df1a86109cfe94210960155.jpg

建议按照视频中的做法,使用分组。当第一次匹配完毕,然后通过$1这样的形式获取第一次匹配的内容:

http://img.mukewang.com/climg/5df1a97f099274b611500374.jpg

3.第三个没有看清楚你匹配的什么,不过按照上面改过来应该就正常了。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

0

0 学习 · 14456 问题

查看课程