计算正则表达式输出字符串

时间:2015-05-19 09:01:06

标签: php regex

用户可以在我的系统中定义标识符的格式,并将其作为正则表达式字符串存储在d / b中(例如,“/^\d{6}$/”,或更复杂的“{{ 1}}“)。

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

非常感谢您的阅读!

1 个答案:

答案 0 :(得分:1)

这个答案假设有5件事:

  1. 根据您的示例,表达式很简单。
  2. 您的表达中没有*+个运算符。
  3. 您没有foo{n, }类型的模式,其中n是一些正整数值。
  4. 每个表达式都以^开头,以$结尾。
  5. 我还假设每个词都跟着你期望匹配它的次数。
  6. 要计算它们匹配的字符数量,您可以查看表达式并查找2种模式:

    1. {n},翻译为完全匹配n次。在这种情况下,请提取n
    2. {n, m},转化为至少n次,最多m次。在这种情况下,请提取m
    3. 一旦您拥有所有nm值,您只需将它们添加到一起。

      关于假设的更多细节:

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

      2. *+运算符分别表示0或更多,以及1或更多。因此,从理论上讲,对于匹配的东西的长度没有限制。

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

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

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