uni-app 中 uts 正则表达式的 exec 方法在多次执行后疑似只会对 lastIndex 属性的值自动更新一次

发布于 1周前 作者 gougou168 来自 Uni-App

uni-app 中 uts 正则表达式的 exec 方法在多次执行后疑似只会对 lastIndex 属性的值自动更新一次

不知 uts 中正则表达式 exec 方法的行为是否本就与下述情况一致。如果本就与下述情况一致,那么请忽略本提问及以下描述。

出现地点:

uni-app-x 的 uvue 页面, <script> 标记的 uts 代码中。

出现 bug 的语言点:

正则表达式的 exec 方法以及其 lastIndex 属性。

bug 具体情况过程描述:

描述前,先以文字说明方式定义两个变量,以便于以下的描述:

  • re – (正则表达式)
  • str – (字符串)

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

  • 对字符串 str 执行正则表达式 re 的 exec 方法 – (执行完毕后,按照文档说明,re 的 lastIndex 属性值应该 自动 由 0 变为 1。代码运行到这里,是符合这个预期的。而 bug 是从下面一步开始出现的。)
  • 再次对字符串 str 执行正则表达式 re 的 exec 方法 – (第二次执行完毕后,按照预期,re 的 lastIndex 属性值应该 自动 由 1 变为 2,但是 lastIndex 属性值却没有变化,依然保持为 1。)
  • 第三次对字符串 str 执行正则表达式 re 的 exec 方法 – (re 的 lastIndex 属性值依然保持为 1。)
  • 第四次对字符串 str ……
  • 后续无论多少次执行 exec 方法,lastIndex 属性值都不会再发生变化,而是始终保持为 1。

1 回复

uni-app 中使用正则表达式时,确实需要注意 lastIndex 属性的行为,尤其是在多次调用 exec 方法时。lastIndex 属性是一个整数,表示下一次匹配开始的搜索位置。如果正则表达式带有全局(g)或粘性(y)标志,每次调用 exectest 方法后,lastIndex 会被更新为下一次匹配开始的位置。

然而,你提到的 lastIndex 疑似只更新一次的问题,可能是由于正则表达式的使用方式或上下文导致的。下面是一个示例代码,展示了如何在 uni-app 中正确使用带有 g 标志的正则表达式,并多次调用 exec 方法:

// 示例代码
Page({
  onLoad() {
    // 定义一个带有全局标志的正则表达式
    const regex = /test(\d+)/g;
    const str = "test1 test2 test3";

    // 第一次调用 exec 方法
    let match = regex.exec(str);
    console.log("First match:", match); // 输出: ["test1", "1", index: 0, input: "test1 test2 test3", groups: undefined]
    console.log("lastIndex after first exec:", regex.lastIndex); // 输出: 5

    // 第二次调用 exec 方法
    match = regex.exec(str);
    console.log("Second match:", match); // 输出: ["test2", "2", index: 6, input: "test1 test2 test3", groups: undefined]
    console.log("lastIndex after second exec:", regex.lastIndex); // 输出: 11

    // 第三次调用 exec 方法
    match = regex.exec(str);
    console.log("Third match:", match); // 输出: ["test3", "3", index: 12, input: "test1 test2 test3", groups: undefined]
    console.log("lastIndex after third exec:", regex.lastIndex); // 输出: 16

    // 没有更多匹配时,exec 返回 null,并且 lastIndex 不会被更新(保持在最后一个匹配之后)
    match = regex.exec(str);
    console.log("No more matches:", match); // 输出: null
    console.log("lastIndex after no more matches:", regex.lastIndex); // 输出: 16
  }
});

在上面的代码中,我们定义了一个带有全局标志的正则表达式 regex,并在一个字符串 str 上多次调用 exec 方法。每次调用后,lastIndex 属性都会正确地更新为下一次匹配开始的位置。

如果你发现 lastIndex 没有按预期更新,可能是因为:

  1. 正则表达式没有全局(g)或粘性(y)标志。
  2. 字符串或正则表达式的使用方式有误。
  3. 外部代码(如其他函数或事件处理器)可能在不适当的时候修改了 lastIndex

确保你的正则表达式和字符串使用正确,并且没有其他代码干扰 lastIndex 的值。

回到顶部