用户可以在我的系统中定义标识符的格式,并将其作为正则字符串存储在d/b中(例如," /^'d{6}$/
",或更复杂的示例" /^[A-Z]{2}'d{8}$/
")。
有没有人建议我如何计算给定regex可以匹配的字符串的最大长度(感谢@Ulver)?
感谢您的阅读!
这个答案假设了5件事:
- 表达式是简单的,根据你的例子。
- 表达式中没有
*
或+
操作符。 - 没有
foo{n, }
类型的模式,其中n
是某个正整数。 - 每个表达式以
^
开始,以$
结束。 - 我也假设每个术语之后是您期望匹配它的次数。
要计算它们匹配的字符数量,您可以遍历表达式并查找2种模式:
-
{n}
,转换为精确匹配n
次。在本例中,提取n
。 -
{n, m}
,转换为至少匹配n
次,最多匹配m
次。在本例中,提取m
。
一旦你有了所有的n
和m
的值,你只需把它们加在一起。
关于假设的更多细节:
-
随着表达式变得越来越复杂,您将需要跟踪各种字符。例如,
^[A-Z]{2}$
表示匹配2个大写字母。因此,匹配的长度将是2。另一方面,foo{2}
表示fooo
。但是afooo
和foooobar
也会匹配。因此,您无法控制模式的长度。此外,(abc){2}
表示匹配abc
两次,因此,在这种情况下,您需要将n
的值(大括号中的值)与其前面的括号中的长度(如果有的话)相乘。当然,您可以使用嵌套的值。 -
*
和+
运算符分别表示大于等于0和大于等于1。因此,从理论上讲,无论匹配的是什么,长度都没有限制。 -
与第2点类似,
{n,}
表示至少匹配n
次。因此,没有上限。 -
与第一点类似,没有
^
和$
锚点,表达式可以匹配任何字符串。表达式foo
可以匹配afoo
、foobar
、foooooooooooooooooooooooo
等。 -
我做这个假设的原因类似于第一点。您可以增强应用程序以查找
[]
对并将其计数为1个字符,但我认为您可以有其他注意事项。