在红宝石中解读这个正则表达式

时间:2018-04-13 03:21:20

标签: ruby regex

octet = /\d{,2}|1\d{2}|2[0-4]\d|25[0-5]/
ip_regex = /^#{octet}\.#{octet}\.#{octet}\.#{octet}/

上面的正则表达式用于匹配IP地址。我知道\ d用于匹配数字,我也理解ip_regex部分,但在看了一些教程后我仍然无法完全理解八位字节部分。 有人可以开导我吗? {,2}|1的含义是什么?

3 个答案:

答案 0 :(得分:2)

  

例如{,2}|1是什么意思?

您应该查看由|分隔的部分 - \d{,2}是一种模式,1\d{2}是一种模式,等等。这就是它们的含义:

  • \d{,2} - 最多2位数字符,即0到99之间的数字
  • 1\d{2} - 数字1后跟2位数字,即数字从100到199
  • 2[0-4]\d - 2,然后是0到4之间的数字,然后是数字,即200到249之间的数字
  • 25[0-5] - 2,5和0到5之间的数字,即250到255之间的数字

当你与|一起加入时,它是匹配任何这些模式的模式,即0到255之间的数字。

\d{,2}模式有点不对,因为它也匹配空字符串并允许前导零,这与其他模式不一致。

如果你想检查整个字符串是否与模式匹配,那么正确的版本可能就是这样:

octet = /\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]/
ip_regex = /\A#{octet}\.#{octet}\.#{octet}\.#{octet}\z/

答案 1 :(得分:0)

IP地址中的一个八位字节(以点分八位字符表示)不得超过255.

所以给定/\d{,2}|1\d{2}|2[0-4]\d|25[0-5]/,将其分开:/ \d{,2} | 1\d{2} | 2[0-4]\d | 25[0-5] /x

第一个剪辑\d{,2}匹配1位或2位数字。第二个剪辑1\d{2}匹配100到199之间的任何数字。第三个剪辑2[0-4]\d匹配200到249之间的任何数字。最后一个剪辑25[0-5]匹配任意数字。 250和255.把它们放在一起,一个八位字节可以是1到255之间的任何数字。

答案 2 :(得分:0)

有一个非常酷的工具来帮助理解正则表达式:https://regexper.com它为您提供了有限状态自动机,它更直观,易于理解正则表达式。

例如,对于八位字节get

octet

虽然{,2}仍然不是很清楚。 a{,2}表示最大值为2,因此它等于{0,2}(介于0和2之间)。在常规expresion regexper中更改它会使它更好一点:

enter image description here

现在我觉得它很容易阅读。

另一个尝试正则表达式的好工具是Rubular