仅正则表达式 - 检查文本是否在提供的出现范围内包含指定字符

RegExp only - check if text contains specified character within provided range of occurrences

我想检查 f.e 字母“a”在提供的文本输入中是否总共出现 3 到 5 次(含)。

给定:

  1. zayaaxaawv <- 5 个“a”,通过
  2. zayaxawva <- 4 个“a”,通过
  3. zaaay <- 3 个“a”,通过
  4. zayax <- 2 个“a”,失败
  5. zayaaxaaaw <- 6 个“a”,失败

示例 1-3 通过,4-5 失败。

我知道可以在 JavaScript 中完成而不使用 RegExp,f.e:

const txt = `zayaxawva`;
const charCountByFilter = [...txt].filter(letter => letter === 'a').length;
const charCountByMatch = txt.match(/a/g).length;

console.log('isInRange by filter', isInRange(charCountByFilter));
console.log('isInRange by match', isInRange(charCountByMatch));

function isInRange(value) {
    return value >= 3 && value <= 5;
}

但是,是否可以完全通过 RegExp 来完成?我想到了类似于/a{3,5}/.test(txt)的东西,但它只计算后续的“a”字符,而不是所有字符。

您可以使用

^(?:[^a]*a){3,5}[^a]*$

regex demo。详情:

  • ^ - 字符串锚点的开始
  • (?:[^a]*a){3,5} - 匹配三个、四个或五个出现的非捕获组
    • [^a]* - a
    • 以外的零个或多个字符
    • a - 一个 a 字符
  • [^a]* - a
  • 以外的零个或多个字符
  • $ - 字符串锚点的结尾。

查看 JavaScript 演示:

const strings = ['zayaaxaawv','zayaxawva','zaaay','zayax','zayaaxaaaw'];
const l = 'a', min = 3, max = 5;
const rx = new RegExp(`^(?:[^${l}]*${l}){${min},${max}}[^${l}]*$`);
strings.forEach(x => console.log(x, '=>', rx.test(x)));