You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于正则表达式计算输入框剩余可输入最大字符数的实现求助

基于正则表达式计算输入框剩余可输入最大字符数的实现求助

我正在开发一个Angular掩码输入组件,组件里把输入拆成了多个分段输入框,每个分段对应固定掩码分隔符,且每个输入框都有对应的正则校验规则。为了实现输入框的自动适配宽度,我需要知道用户当前还能输入多少字符:不仅要在输入过程中动态调整宽度,初始状态下输入框就要匹配预期的最大输入长度,输入时则要根据已输入内容+剩余可输入的最大长度来更新宽度。

目前我已经通过refa的AST解析实现了获取正则表达式允许的最大输入长度的逻辑,对于无上限的量词(比如a*),我会给它设一个固定上限值(比如5)。这段代码目前运行正常,先贴出来给大家参考:

private getMaxLength(pattern: RegExp): number {
  const { expression } = JS.Parser.fromLiteral(pattern).parse();
  return Math.max(
    0,
    ...expression.alternatives.map(concat => this.maxConcatenationLength(concat))
  );
}

private maxNodeLen(node: Element): number {
  switch (node.type) {
    case 'CharacterClass':
      return 1;
    case 'Quantifier': {
      const q = node;
      const capMax = q.max === Infinity ? this.UNBOUNDED_CAP : q.max;
      // 每个量词内部应该只有一个串联节点
      const innerConcatenation = q.alternatives[0];
      const innerMax = this.maxConcatenationLength(innerConcatenation);
      return innerMax * capMax;
    }
    case 'Alternation':
      return Math.max(
        ...node.alternatives.map((a: any) => this.maxConcatenationLength(a))
      );
    default:
      // 跳过断言和未知类型节点
      return 0;
  }
}

private maxConcatenationLength(concat: Concatenation): number {
  return concat.elements.reduce((s: number, e: Element) => s + this.maxNodeLen(e), 0);
}

举几个测试用例,结果都是符合预期的:

  • /^ba*b$/ 返回7(因为a*被上限为5,总长度1+5+1=7)
  • /^a*b$/ 返回6(5+1=6)
  • 匹配UUID的正则返回36,完全符合预期

现在我遇到了卡点:我需要根据用户已经输入的字符串,计算出当前还能输入的最大字符数。比如正则是a*a,用户已经输入了aa,在无上限量词被设为5的情况下,剩余可输入的最大字符数应该是4(因为正则允许的总最大长度是5+1=6,已输入2,6-2=4)。

之前的最大长度计算逻辑只关注正则本身的结构,完全不考虑已输入内容;而现在我需要把已输入字符串和正则的结构结合起来,找到当前已输入内容对应的正则匹配进度,再推导出剩余的最大可输入长度。我尝试在现有逻辑上扩展,但一直没找到正确的方向,想请教各位大佬,该怎么修改或扩展现有的AST解析逻辑,来实现这个需求?


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.09 03:03:15