上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: bigonion - 

关于js正则匹配问题求助

[复制链接]
  • TA的每日心情
    开心
    2024-2-27 14:20
  • 签到天数: 88 天

    [LV.6]常住居民II

    22

    主题

    97

    回帖

    306

    积分

    荣誉开发者

    积分
    306

    油中2周年新人报道荣誉开发者生态建设者

    发表于 2023-3-17 00:36:00 | 显示全部楼层 | 阅读模式
    悬赏10油猫币已解决

    本帖最后由 bigonion 于 2023-3-17 11:19 编辑

    关于js正则匹配获取结果位置索引的问题求助

    问题篇

    最近在做一些需要正则匹配文本的东西,我发现好像难以实现获取正则匹配的下标

    比如说:

    $匹配我$ $匹配我$ 不要匹配我 $匹配我$

    我想要获取这三个match的结果在原文的哪个位置

    `$匹配我$ $匹配我$ 不要匹配我 $匹配我$`.match(/\$.*?\$/g)
    
    //现有输出
    [
        "$匹配我$",
        "$匹配我$",
        "$匹配我$"
    ]

    比如在这里,我希望通过函数来获取这三个匹配的结果下标索引值
    期望输出

    [0,6,18]

    我查了好多资料也没找着js有原生函数实现,好像还在提案中

    不知道各位gg们有没有好的办法,或者曲线救国的方法😀

    解答篇

    感谢
    道哥

    王一之

    李恒雅

    gg们的回答


    总结了一下,有matchAll实现方法

    第一种是道哥说的

    [...`$匹配我$ $匹配我$ 不要匹配我 $匹配我$`.matchAll(/\$.*?\$/g)].map(item=>item.index)

    这里matchAll返回一个迭代器,用[...]可以解构迭代器,返回一个数组,最后通过遍历输出数组中的index参数

    第二种就是李恒雅gg用Array.from来处理matchAll的迭代器

    const text = '$匹配我$ $匹配我$ 不要匹配我 $匹配我$';
    const regex = /\$(.*?)\$/g;
    
    const result = Array.from(text.matchAll(regex), match => match.index);
    
    console.log(result); // [0, 6, 18]

    还有一种一之哥哥提到的exec处理的方法,exec在循环中会更新lastindex数值,

    let reg = /\$.*?\$/g
    let match;
    while (match = reg.exec('$匹配我$ $匹配我$ 不要匹配我 $匹配我$')) {
        console.log(match);
    }

    以下是MDN对这三种方法的解释
    exec MDN
    matchAll MDN

    最佳答案

    查看完整内容

    [md]这题我会! ```js const text = '$匹配我$ $匹配我$ 不要匹配我 $匹配我$'; const regex = /\$(.*?)\$/g; const result = Array.from(text.matchAll(regex), match => match.index); console.log(result); // [0, 6, 18] ``` matchAll方法可以一次性匹配所有符合条件的字符串,并返回一个迭代器,我们可以通过Array.from方法将其转换为一个数组。在这个数组中,每个元素都是一个匹配结果对象,其中包含了匹配到的字符串 ...
  • TA的每日心情
    慵懒
    2023-3-6 10:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    10

    回帖

    10

    积分

    超级版主

    积分
    10

    油中2周年

    发表于 2023-3-17 00:36:01 | 显示全部楼层

    这题我会!

    
    const text = '$匹配我$ $匹配我$ 不要匹配我 $匹配我$';
    const regex = /\$(.*?)\$/g;
    
    const result = Array.from(text.matchAll(regex), match => match.index);
    
    console.log(result); // [0, 6, 18]
    

    matchAll方法可以一次性匹配所有符合条件的字符串,并返回一个迭代器,我们可以通过Array.from方法将其转换为一个数组。在这个数组中,每个元素都是一个匹配结果对象,其中包含了匹配到的字符串、匹配到的字符串的起始位置等信息。我们使用解构语法将其简化为一个只包含起始位置信息的数组。

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-3-17 09:46:26 | 显示全部楼层
    [...`$匹配我$ $匹配我$ 不要匹配我 $匹配我$`.matchAll(/\$.*?\$/g)].map(item=>item.index)
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-3-17 09:48:10 | 显示全部楼层
    // ==UserScript==
    // @name         New Userscript
    // @namespace    https://bbs.tampermonkey.net.cn/
    // @version      0.1.0
    // @description  try to take over the world!
    // @author       You
    // @match        https://bbs.tampermonkey.net.cn/thread-4244-1-1.html
    // ==/UserScript==
    
    let reg = /\$.*?\$/g
    let match;
    while (match = reg.exec('$匹配我$ $匹配我$ 不要匹配我 $匹配我$')) {
        console.log(match);
    }

    油猴脚本猫脚本真方便

    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表