bigonion 发表于 2023-3-17 00:36:00

关于js正则匹配问题求助

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

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

## 问题篇

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

比如说:

```js
$匹配我$ $匹配我$ 不要匹配我 $匹配我$
```

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

```js
`$匹配我$ $匹配我$ 不要匹配我 $匹配我$`.match(/\$.*?\$/g)

//现有输出
[
    "$匹配我$",
    "$匹配我$",
    "$匹配我$"
]
```

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

```js

```

我查了好多资料也没找着js有原生函数实现,好像还在提案中
不知道各位gg们有没有好的办法,或者曲线救国的方法😀

## 解答篇

感谢
[道哥](https://bbs.tampermonkey.net.cn/space-uid-2.html)
[王一之](https://bbs.tampermonkey.net.cn/space-uid-4.html)   
[李恒雅](https://bbs.tampermonkey.net.cn/space-uid-47735.html)
gg们的回答

---------------

总结了一下,有matchAll实现方法
第一种是道哥说的

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

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

第二种就是李恒雅gg用Array.from来处理matchAll的迭代器
```js
const text = '$匹配我$ $匹配我$ 不要匹配我 $匹配我$';
const regex = /\$(.*?)\$/g;

const result = Array.from(text.matchAll(regex), match => match.index);

console.log(result); //
```

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

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

以下是MDN对这三种方法的解释
(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)
(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/matchAll)

李恒雅 发表于 2023-3-17 00:36:01

这题我会!

```js

const text = '$匹配我$ $匹配我$ 不要匹配我 $匹配我$';
const regex = /\$(.*?)\$/g;

const result = Array.from(text.matchAll(regex), match => match.index);

console.log(result); //

```

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

李恒道 发表于 2023-3-17 09:46:26

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

王一之 发表于 2023-3-17 09:48:10

```js
// ==UserScript==
// @name         New Userscript
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry 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);
}
```

~~油猴~~脚本猫脚本真方便
页: [1]
查看完整版本: 关于js正则匹配问题求助