选择 IP 地址的正则表达式

选择 IP 地址的正则表达式

帮我写一个正则表达式,选择以 或 开头并以 结尾的行?192我想要 获取 IP 地址列表,它们可以由、或类型组成,但我只想根据我的规则进行选择。我这样做了:2002
192.168.001.002192.168.001.2192.168.1.002192.168.1.2

(\d{3}\.)(\d{3}\.)(\d{1,3}\.)(\d{1,3})

但是如何找到以某些数字开始和结束的行呢?

更新

(\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})

它工作得很好,但选择了一个不必要的字符串192.168.027.021

答案1

如果希望 IP 以 开头192,请将其添加到正则表达式的开头:

192\.\d{3}\.\d{1,3}\.[02]{1,3}

您希望它以002或结尾2,使用:

192\.\d{3}\.\d{1,3}\.(00)?2

其中(00)?表示可选的两个零。

答案2

总结并明确问题和目标:

  • 目标:获取以 或 开头或192结尾的IP 地址列表2002
  • 包括: 192.168.001.002192.168.001.2192.168.1.002192.168.1.2
  • 尝试过: (\d{3}\.)(\d{3}\.)(\d{1,3}\.)(\d{1,3})
  • 更新:(\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})——有效,但选择了不必要的字符串192.168.027.021

可能你想要的是:

  • grep -P "\b\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt
  • 选择字符串"\b\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt
  • (获取内容 ip.txt)-match "\b\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b"

如果您确实只希望将“192”作为第一个八位字节,那么请将其设为文字:

Select-String "\b192\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt

如果您只想要最后一个八位字节仅以 0 或 2 结尾的 IP 模式,那么这些也可以起作用(这 3 种模式是相同的):

  • grep -P "\b(\d{1,3}\.){3}[02]{1,3}\b" ip.txt
  • 选择字符串"\b(\d{1,3}\.){3}[02]{1,3}\b" ip.txt
  • (获取内容 ip.txt)-match "\b(\d{1,3}\.){3}[02]{1,3}\b"

一到三名数字,然后是.,三次,然后是 1-302字符,前后有“单词”分隔符。

这取决于您使用的 Regex 工具,但我会使用grep -P非常相似的 (PCRE/perl 兼容) 或 PowerShell/.Net 进行测试。

您的第一个正则 (\d{3}\.)(\d{3}\.)(\d{1,3}\.)(\d{1,3})表达式:

  1. 查找 3 位数字和一个文字.(点)
  2. 后跟:3 位数字和一个文字.(点)
  3. 后跟:1 至 3 位数字和一个文字.(点)
  4. 后面跟着:1 至 3 位数字

除非您要量化组或在替换或反向引用中使用它们,否则括号通常是不必要的。

它没有提到这些必须“位于字符串/行的开头或结尾 - 可能没问题,但如果这些嵌入在文本中,则可能不是一个准确的假设。

您的第二次尝试(\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})与此类似,只是第四部分除外([02]{1,3})

  • 查找 a0或 a2一至三次。

...所以是的,当结尾是021- 时它会匹配02,并且没有什么可说的“必须在末尾或行或下一个字符不能是数字(不是02)。

您需要为此“锚定”您的正则表达式 - 将其锚定到行尾,文字文本或“单词分隔符”等。

最简单、也许最通用的是“单词中断”锚点:\b

它是一个零宽度断言(不匹配任何实际字符但断言/要求某些内容为真,从“单词字符”到非单词字符的转换。)

  • 你的:grep -P "(\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})\b" ip.txt
  • 固定的:grep -P "\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt
  • 简化:grep -P "\b\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt

相关内容