# 如何解决 JavaScript 中 RegExp 不幂等的问题？

- Link: https://www.ixiqin.com/2021/07/03/how-to-solve-the-regexp-in-javascript-not-idempotent-problem/
- Published: 2021-07-03T09:12:03+08:00
- Author: 白宦成

在对 WXMarkdown 进行改造的时候，我准备使用 Vercel 提供的 cloudFunction 来实现。

在执行时，出现了一个奇怪的问题，当我使用 RegExp 进行匹配的时候，会出现匹配成功和
匹配失败的情况。

当我回溯代码时，发现问题出现在

    ```javascript
    import type { NextApiRequest, NextApiResponse } from "next";
    const URL = require("url");
    const rule = /BV([0-9a-zA-Z]{1,10})/g;
    export default function handler(
      req: NextApiRequest,
      res: NextApiResponse<MDResponse>
    ) {
        const { url } = req.body;
        const result = rule.exec(url);
    }
    Code language: JavaScript (javascript)
    ```

result 的匹配结果不是每次都是可用的，会交替一次 null，一次有结果。

搜索后了解到，这是由于 RegExp 本身是具有状态的，在这种情况下，由于后一次的调用复
用了之前的请求，所以出现了一次有结果，一次没有结果。

在这种情况下，有两种解决方案：

 1. 在使用 Rule 之前，对其进行重置状态，即在进行匹配之前，先设定 rule.lastIndex 为 
    0
 2. 另一种解决方案是将 rule 的定义放置在导出的函数内部，这样就可以在后续执行的过程中，
    重新初始化。

## Reference

[https://stackoverflow.com/questions/38910334/regular-expression-exec-function-does-not-work-multiple-times](https://stackoverflow.com/questions/38910334/regular-expression-exec-function-does-not-work-multiple-times)
