以下陈述来自我测试并回答的一项家庭作业问题,但我只是不了解该行的行为方式,我想了解原因。我意识到为什么此表达式很难找到IP地址,但是我不完全理解为什么它的行为方式与之类似,因为问号似乎并没有像预期的那样实际运行0或1次。
“ user @ machine:〜$ grep -E'[01]?[0-9] [0-9]?” “
据我了解,“ [01]?”应该寻找括号中指示的任何数字0-1,而问号告诉grep仅寻找零个或一个实例,并且与“ [0-9]”相似。问题是,此行将打印不限数量的数字,其长度超过3位。我排除了这是由于第三个括号没有继续的问号,因为如果通过管道传送回声或使用充满数字的测试.txt文件,它仍然可以打印无限数量的数字。
上面的例子使我比不知道如何用正确的方式用grep查找IP。因此,我发现了无数示例,例如用于IPv4八位字节的以下表达式:
\。(25 [0-5] \ | 2 [0-4] [0-9] \ | [01] [0-9] [0-9] \ | [0-9] [0- 9])。\
这是否告诉我寻找0-5次之间任何2-5的数字? 0-5对于一个八位位组而言太多位数。它告诉我寻找0到25之间的任何数字吗?同样,对于一个八位位组来说,位数太多了。在这种情况下,\ 2 [0-4] [0-9] \是什么意思?我对这个表达式如何严格地查找介于1-255之间的数字感到困惑?
答案 0 :(得分:0)
以这种方式查看:x?[0-9]x?
匹配包含数字的任何内容,因为两个x
:是可选的。您最好将它们排除在外,因为它们根本不会限制比赛。
25[0-5]
查找25
,后跟0-5范围内的数字。换句话说,该表达式匹配范围在250-255之间的数字。
示例中的完整表达式通过枚举以25、20-24等开头的字符串来查找范围在00-255之间的数字;尽管它不完整,因为它不允许使用一位数字。
表达式匹配单个八位字节(不完全),而不匹配整个IP地址。这是匹配IPv4地址的常用方法:
([3-9][0-9]?|2([0-4][0-9]?|5[0-9]?|[6-9])?|1([0-9][0-9]?)?)(\.([3-9][0-9]?|2([0-4][0-9]?|5[0-9]?|[6-9])?|1([0-9][0-9]?)?){3}
其中方括号表示与一组字符中的单个字符匹配的字符类,最后的花括号{3}
表示重复。
某些正则表达式方言(例如POSIX grep
)在|
和\(
之前需要反斜杠,但是我使用了扩展符号(例如grep -E
和大多数在线正则表达式探索工具),不需要反斜杠。