【问题标题】:Previous Matches in Global RegEx Preventing Adjacent Overlapping Matches全局正则表达式中的先前匹配防止相邻重叠匹配
【发布时间】:2021-01-31 04:11:20
【问题描述】:

我想找到至少在一侧被空格包围的字符的所有次出现。我还想在我的比赛中包含空格。此外,如果有多个相邻匹配项,我想加倍计算空格。

正则表达式:/(\s*\w\s*)/g

样本数据:a b c d e f g

实际结果:[" b "," d "," f "]

想要的结果:["a "," b "," c ", " d "," e "," f "," g"]

我查看了其他几个类似的 SO 问题,这些问题大多指向使用环视组。我已经尝试了一些环顾四周的尝试,但不确定如何在捕获重叠空间的同时解决它们。我试图避免使用捕获组,因为需要将每个 单独捕获 作为数组。对于上下文,我使用的是基于 JavaScript 的正则表达式引擎。

有没有办法全局捕获 RegEx 的 所有 匹配项,即使是相邻和重叠的匹配项?

【问题讨论】:

    标签: javascript regex regex-lookarounds


    【解决方案1】:

    您可能会消极地向后看,断言直接在左边的不是空白字符。

    然后可以使用前瞻内的捕获组直接在右侧断言此模式\s*\w\s*

    该值在捕获组 1 中。

    (?<!\s)(?=(\s*\w\s*))
    

    Regex demo

    const regex = /(?<!\s)(?=(\s*\w\s*))/g;
    const str = `a  b  c  d  e  f  g`;
    let m;
    let result = [];
    
    while ((m = regex.exec(str)) !== null) {
      // This is necessary to avoid infinite loops with zero-width matches
      if (m.index === regex.lastIndex) {
        regex.lastIndex++;
      }
      result.push(m[1]);
    
    }
    console.log(result);

    【讨论】:

      【解决方案2】:

      lookarounds 与字符本身不匹配,因此如果我们需要以这种方式捕获它,我们应该单独捕获字符。一种方法是:

      const text = "a  b  c  d  e  f  g";
      const regex = /(?:(?<=\s)\s|)\w(?:(?=\s)\s|)/g
      console.log(text.match(regex))

      这在第一部分使用正向后视,在第二部分使用正向前瞻。 (可能并非所有地方都支持正向回溯)。

      这是一种if else 声明:

      • 如果字母字符前有空格:(?:(?&lt;=\s)
      • 包括:\s
      • 其他任何东西都算数:|

      【讨论】:

        【解决方案3】:

        我不确定我是否完全理解您的需求,但我建议尝试这种模式:

        let pattern = /(\s?\w\s?)/g
        
        console.log(("a  b  c  d  e  f  g").match(pattern))

        它匹配每边的一个字母和一个空格,如果有的话(包括重叠的)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-05
          • 2010-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多