计算一个正则表达式输出字符串的最大长度


Calculate the max length of a regex output string

用户可以在我的系统中定义标识符的格式,并将其作为正则字符串存储在d/b中(例如," /^'d{6}$/ ",或更复杂的示例" /^[A-Z]{2}'d{8}$/ ")。

有没有人建议我如何计算给定regex可以匹配的字符串的最大长度(感谢@Ulver)?

感谢您的阅读!

这个答案假设了5件事:

  1. 表达式是简单的,根据你的例子。
  2. 表达式中没有*+操作符。
  3. 没有foo{n, }类型的模式,其中n是某个正整数。
  4. 每个表达式以^开始,以$结束。
  5. 我也假设每个术语之后是您期望匹配它的次数。

要计算它们匹配的字符数量,您可以遍历表达式并查找2种模式:

  1. {n},转换为精确匹配n次。在本例中,提取n
  2. {n, m},转换为至少匹配n次,最多匹配m次。在本例中,提取m

一旦你有了所有的nm的值,你只需把它们加在一起。


关于假设的更多细节:

  1. 随着表达式变得越来越复杂,您将需要跟踪各种字符。例如,^[A-Z]{2}$表示匹配2个大写字母。因此,匹配的长度将是2。另一方面,foo{2}表示fooo。但是afooofoooobar也会匹配。因此,您无法控制模式的长度。此外,(abc){2}表示匹配abc两次,因此,在这种情况下,您需要将n的值(大括号中的值)与其前面的括号中的长度(如果有的话)相乘。当然,您可以使用嵌套的值。

  2. *+运算符分别表示大于等于0和大于等于1。因此,从理论上讲,无论匹配的是什么,长度都没有限制。

  3. 与第2点类似,{n,}表示至少匹配n次。因此,没有上限。

  4. 与第一点类似,没有^$锚点,表达式可以匹配任何字符串。表达式foo可以匹配afoofoobarfoooooooooooooooooooooooo等。

  5. 我做这个假设的原因类似于第一点。您可以增强应用程序以查找[]对并将其计数为1个字符,但我认为您可以有其他注意事项。