我要匹配以下模式。
98.40.1.0/12 104.12.1.222 0 37430 9123 817 i
44.156.112.10 0 0 2224 6336 711 i
51.134.121.9 0 7456 8936 1222 900 i
我写了如下表达式:
\s+(\S+)\s+(\S+)(?:\d+\s+|\s+)(?:\d+\s+|\s+)(.*)
,但它并不适用于所有三行,因为第二行和第三行在第一列中没有数据。
有人可以为我建议一个解决方案吗?
答案 0 :(得分:0)
以下正则表达式工作(在python中测试):
((\d*\.\d*\.\d*\.\d*)([\/]\d*)?)(\s*\d*\.\d*\.\d*\.\d*)*((\s*\d*)*)
此解决方案仅适用于假设:模式“98.40.1.0/12”仅在开始时,其他的其他模式将为“104.12.1.222”
输出 - 应仅在位置1,4和5处使用匹配:
Match 1
1. 98.40.1.0/12
2. 98.40.1.0
3. /12
4. 104.12.1.222
5. 0 37430 9123 817
6. Empty
Match 2
1. 44.156.112.10
2. 44.156.112.10
3. None
4. None
5. 0 0 2224 6336 711
6. Empty
Match 3
1. 51.134.121.9
2. 51.134.121.9
3. None
4. None
5. 0 7456 8936 1222 900
6. Empty
答案 1 :(得分:0)
这是一个很好的方法:
尝试符合上述规则的解决方案(为了便于阅读,我将其拆分 分为2行):
(?(DEFINE)(?<IP>\d+\.\d+\.\d+\.\d+))
^((?&IP)\/\d+)?\s+((?&IP))(?:\s+0)+ ((?:\d+ )+\d+)
包含选项g
(全球)和m
(多行)。
各个部分的描述:
(?(DEFINE)(?<IP>\d+\.\d+\.\d+\.\d+))
- 定义命名捕获
组(组#1,名称IP
)。这只是一个定义,这个
小组(到目前为止)没有捕获任何东西。^
- 由于m
选项而导致的一行(不是整个字符串)。((?&IP)\/\d+)?
- 捕获第2组,包括:
IP
组的成员,?
)。\s+
- 一系列空格。((?&IP))
- 捕获第3组 - 另一个&#34;电话&#34; IP
群组。(?:\s+0)+
- 非捕获组 - 空格和0
,重复
好几次。
- 上一个0
之后的空格。((?:\d+ )+\d+)
- 捕获第4组,包括:
此正则表达式捕获:
98.40.1.0/12
- 第2组,104.12.1.222
- 第3组,37430 9123 817
- 第4组。44.156.112.10
- 第3组,2224 6336 711
- 第4组。51.134.121.9
- 第3组,7456 8936 1222 900
- 第4组。