8

如何找到给定正则表达式的最小和最大长度?

例如

[1-9]?[0-9]

此正则表达式可以生成最小 1(0 或 1 0r 2.... 或 9)和最大字符串长度 2(10 或 11 或 12 或......19 或 20 或 21...... .......或99)

同样,任何人都可以提供一个可以计算给定正则表达式的最小和最大长度的函数吗?哪个可以将下面的正则表达式作为输入?

^[a-zA-Z0-9][a-zA-Z0-9.-]{0,64}[a-zA-Z0-9]$
^[a-zA-Z0-9._-]{1,255}$
^[a-zA-Z0-9 !#$'()*+,./:;=?@\\^_`~-]{1,30}$
^[]a-zA-Z0-9 !#$'()*+,./:;=?@[^_`{|}~-]{0,50}$
^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$
4

3 回答 3

5

正则表达式仅由非常小的一组元素组成。

  1. 原子(例如aor[a-k].),
  2. 选择(例如r1|r2),
  3. 重复(例如r{3,10}, r+, r*, r?)。
  4. (r)可以重复或选择的组(例​​如)。
  5. 特价商品(例如^, $)。

除非我们想添加非消耗性的前瞻和类似的东西,否则或多或少是这样,但它们不是您的示例输入的一部分,所以我不会考虑这些。

这些可以多长时间(最小/最大)?

  1. 1 / 1(原子大小不变)
  2. min(minlen(r) 用于 r 的选择) / max(maxlen(r) 用于 r 的选择)
  3. minlen(r) * minrepretition / maxlen(r) * maxrepetition
  4. minlen(r) / maxlen(r)
  5. 0(位置参数匹配空字符串)。

因此,您需要的是一个正则表达式解析器(正如 Hugh Bothwell 在他的回答中所建议的那样),它像给定正则表达式的抽象语法树(absy)一样返回给您;然后可以使用我上面勾勒的规则来分析这个absy,以找到给定正则表达式可以匹配的字符串的最小或最大长度。

于 2014-02-28T09:16:17.843 回答
4

http://pyparsing.wikispaces.com/file/view/invRegex.py有一些用于 pyparsing 中的正则表达式解析器的起始代码;修改它来做你想做的应该不难。

一些教程可以在http://pyparsing.wikispaces.com/Examples找到

于 2014-02-28T00:11:36.957 回答
2

看起来您需要构建一个正则表达式解析器来解析这些正则表达式并为您计算。将括号视为单个字符,将大括号视为变量 len 和|'s 的东西会增加可变性。看来你有很多功课摆在你面前。祝你好运!

编辑,一些额外的帮助。

好的,这里有一点可以帮助您入门:

这个正则表达式,例如:

^[a-zA-Z0-9 !#$'()*+,./:;=?@\\^_`~-]{1,30}$
^^--------one of these characters--^^----^^-end of string
^---start of string                   ^one to thirty times

所以这个正则表达式的长度是 1 到 30 个字符。

这有帮助吗?但说真的,我不会做更多的事情,你需要阅读重新文档:http ://docs.python.org/library/re.html

于 2014-02-28T00:00:31.417 回答