Linux 与有效IPv4地址的正则表达式混淆

Linux 与有效IPv4地址的正则表达式混淆,linux,grep,Linux,Grep,我正在尝试编写一个正则表达式,用于从包含许多有效、无效(两种)地址类型的文件中选择有效的IPv4地址。 我已经为此编写了正则表达式,但仍在打印出两个无效的IPv4地址-255.255.256.255和8.234.88,55 有谁能帮我理解为什么这两个都是用我放的正则表达式打印出来的 ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){1,3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) 我使用这个正则表达式通过包含以下列出的IP

我正在尝试编写一个正则表达式,用于从包含许多有效、无效(两种)地址类型的文件中选择有效的IPv4地址。 我已经为此编写了正则表达式,但仍在打印出两个无效的IPv4地址-255.255.256.255和8.234.88,55 有谁能帮我理解为什么这两个都是用我放的正则表达式打印出来的

((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){1,3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
我使用这个正则表达式通过包含以下列出的IPv4地址的文件筛选有效的IPv4地址

12.12.12.12
127.0.0.0
255.255.256.255
344.19.0.1.
12.255.12.255
138.168.5.193
256.123.256.123
195.45.13.0
8.234.88.55
1334.0.1.234
196.83.83.191
133.133.133.133
8.234.88,55
203.26.27.38
88.173.71.66
136.186.20.9
241.92.88.103
我想知道为什么这个正则表达式与255.255.256.255和8.234.88,55个IPv4地址匹配。

((25[0-5]| 2[0-4][0-9]|[01]?[0-9][0-9]?)

12.12.12.12
127.0.0.0
255.255.256.255
344.19.0.1.
12.255.12.255
138.168.5.193
256.123.256.123
195.45.13.0
8.234.88.55
1334.0.1.234
196.83.83.191
133.133.133.133
8.234.88,55
203.26.27.38
88.173.71.66
136.186.20.9
241.92.88.103
我已经尝试过C++中的表达式。 在点之前添加一个额外的斜杠解决了这里的逗号问题

它解析了一个逗号,因为您缺少一个斜杠,它的书写方式将点解释为“解析除EOL以外的任何字符”

此外,当您放入[01]时,表达式允许值的前缀为0

关于如何处理这个表达式,有一个建议:如果它只有一个数字,怎么能写呢?然后是2位数,然后是3位数

(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])

正则表达式未锚定到字符串的开头和结尾。它匹配每行的片段,而不是整行

将您的
regex
放在
^
$
之间

^
匹配字符串的开头<代码>$匹配字符串的结尾

如果启用多行匹配,
^
匹配行首,
$
匹配行尾

另外,
regex
稍微有点不正确,这使得它的匹配比它应该匹配的少。IPv4地址始终有4个组件。由于
{1,3}
,您的
regex
允许2到4个组件。再加上缺少锚,它会在您提到的行中找到两个匹配项

看一看

regex
应该是:

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
为什么此正则表达式与255.255.256.255和8.234.88,55 IPv4地址匹配

12.12.12.12
127.0.0.0
255.255.256.255
344.19.0.1.
12.255.12.255
138.168.5.193
256.123.256.123
195.45.13.0
8.234.88.55
1334.0.1.234
196.83.83.191
133.133.133.133
8.234.88,55
203.26.27.38
88.173.71.66
136.186.20.9
241.92.88.103
没有。它与该字符串的部分匹配。很可能你做到了:

$ echo '255.255.256.255' | grep -E '((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){1,3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
255.255.256.255
是的,它起作用了。但是模式与整体不匹配,它分别与部分
255.255.25
6.255
匹配。
{1,3}
只允许第一部分匹配一次或两次,不一定是三次。比如:

 ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
   25  5                                 .   25  5                                 .                             2    5    6.255
                                                                                                                           ^^^^^ - left over
由于
{1,3}
的原因,第一部分只能匹配一次。因为
grep
将正则表达式应用于字符串的一部分,并且因为匹配了完整的正则表达式,所以打印该行

同样,对于
8.234.88,55
零件
8.234.88
匹配,而
,55
不匹配。很酷地看到:

$ echo '8.234.88,55' | grep --color -E '(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){1,3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){1}'
8.234.88,55
^^^^^^^^ - is red

要匹配整行,请执行
grep-x
或添加锚定
^….$
,或者您很可能希望将
{1,3}
更改为
{3}
以精确匹配3个部分。

不要发布链接或屏幕截图。相反,发布一个。。这里的人认为这是邪恶的。我已经按照建议做出了改变。感谢
为什么此正则表达式与255.255.256.255和8.234.88,55个IPv4地址匹配
它不匹配。您检查正则表达式是否匹配的方法有缺陷。在搜索IPV4地址的
regex时,有超过200个其他Q/A。这就是维护一个数据库的目的,该数据库包含常见问题及其答案;-)。。。不过,很高兴你在下面得到了一些好的反馈。祝您好运。您混淆了 ReXEX <代码>所要求的<>代码> \/>代码,并将C++编写字符串所需的规则作为源代码进行逃逸。在C++源代码中必须使用双<代码> \/COD>,但实际上,在字符串中只有一个<代码> \/COD>。另一个是语言所要求的。原始正则表达式在这一点上是正确的。如果用撇号包装,问题中提供的
regex
可以在命令行中使用,不需要额外转义。