老师,如何匹配一个字符串中所有的"ab"?

老师,如何匹配一个字符串中所有的"ab"?

程序如下所示,但是运行结果不正确。

源字符串中有英文字母、汉字、数字、空格等字符。我想匹配所有的"ab",并且求出匹配次数和每次"ab"出现的下标。应该如何实现呢?


// 源字符串
let sourceStr = "Hello, ab哇哈哈(dcsd)c v/7/4vd/34#$%^&*abv_abCXKabHD";

// 正则表达式
let regExp = /ab/;

// 匹配次数
let matchTime = 0;

// 当匹配结果不为null时
while (regExp.exec(sourceStr))
{
    ++matchTime;
    console.log("第" + matchTime + "次匹配:" + regExp.exec(sourceStr));
    console.log("出现的下标:" + regExp.exec(sourceStr).index);
}


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,老师把你的例子修改了一下,并加了注释,可以参考注释与代码理解一下:

<!DOCTYPE html>

<html>


<head>

    <meta charset="UTF-8">

    <title>sd</title>

</head>


<body>

    <script>

    // 源字符串

    let sourceStr = "Hello, ab哇哈哈(dcsd)c v/7/4vd/34#$%^&*abv_abCXKabHD";


    // 正则表达式

    // let regExp = /ab/;

    let regExp = /ab/g; //++++这里改成全局匹配++++


    // 匹配次数

    let matchTime = 0;


    // 判断是否要循环,默认循环

    let isWhile = true;


    // 当匹配结果不为null时


    while (isWhile) {


        try {

            // regExp.exec(sourceStr) 匹配第一次后,会继续往下匹配。

            // 所以不要出现多次,例如while循环括号中写了regExp.exec(sourceStr),匹配了第一个ab,

            // 那么循环里面再执行regExp.exec(sourceStr),则匹配了第二个ab。这样输出的时候,是从第二个开始的,

            // 所以regExp.exec(sourceStr)只能写一次。

            var index = regExp.exec(sourceStr).index;

            // 当匹配不到的时候,获取index时会报错,所以把这一句代码放在try中,

            // 当发生报错后,catch捕获错误,然后退出循环,从而让控制台不报错。

           

        } catch (err) { //这个err是接收报错信息的,这里就不输出了。


            // 跳出循环

            break;


        }


        matchTime++;


        console.log("第" + matchTime + "次匹配ab"); 

        console.log("出现的下标:" + index);

    }

    </script>

</body>


</html>

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

  • 我明白了。利用regExp.exec(sourceStr)匹配失败时返回null,null没有index属性而出错时,由catch处理(这里的处理时跳出循环)。
    2019-12-24 21:52:25
提问者 我学习太差被关起来了 2019-12-24 22:05:29

我后来想到是这样的,不用try-catch语句也可以实现。

判断源字符串中有没有特定的的字符串,如果有,请全部找出它们,并求出其下标和总出现次数。

举例如下:

// 源字符串
let sourceStr = "I like JS and Python. When I was six years old, my father taught me Python at home." +
   "When I was eight, I learned JS by myself and...";

// 正则表达式(全局模式,忽略大小写)
let regExp = /CPP|JS|Python/gi;

// 匹配次数
let num_matchTime = 0;

// 匹配结果
let str_result = regExp.exec(sourceStr);

// 只要匹配结果不为null
while (str_result)
{
   // 匹配次数加1
   ++num_matchTime;

   // 输出匹配结果
   console.log("第" + num_matchTime + "次匹配:" + str_result);

   // 继续匹配
   str_result = regExp.exec(sourceStr);
}

// 最后输出匹配次数
console.log("匹配次数:" + num_matchTime);


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师