帮我写一个正则表达式,选择以 或 开头并以 结尾的行?192
我想要 获取 IP 地址列表,它们可以由、或类型组成,但我只想根据我的规则进行选择。我这样做了:2
002
192.168.001.002
192.168.001.2
192.168.1.002
192.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 地址列表2
002
- 包括:
192.168.001.002
、192.168.001.2
或192.168.1.002
192.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-30
或2
字符,前后有“单词”分隔符。
这取决于您使用的 Regex 工具,但我会使用grep -P
非常相似的 (PCRE/perl 兼容) 或 PowerShell/.Net 进行测试。
您的第一个正则 (\d{3}\.)(\d{3}\.)(\d{1,3}\.)(\d{1,3})
表达式:
- 查找 3 位数字和一个文字
.
(点) - 后跟:3 位数字和一个文字
.
(点) - 后跟:1 至 3 位数字和一个文字
.
(点) - 后面跟着:1 至 3 位数字
除非您要量化组或在替换或反向引用中使用它们,否则括号通常是不必要的。
它没有提到这些必须“位于字符串/行的开头或结尾 - 可能没问题,但如果这些嵌入在文本中,则可能不是一个准确的假设。
您的第二次尝试(\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})
与此类似,只是第四部分除外([02]{1,3})
:
- 查找 a
0
或 a2
一至三次。
...所以是的,当结尾是021
- 时它会匹配02
,并且没有什么可说的“必须在末尾或行或下一个字符不能是数字(不是0
或2
)。
您需要为此“锚定”您的正则表达式 - 将其锚定到行尾,文字文本或“单词分隔符”等。
最简单、也许最通用的是“单词中断”锚点:\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