【发布时间】:2014-12-09 13:33:27
【问题描述】:
我正在尝试从一个带有路由的文件中获取信息,因此对于这项工作,我选择了正则表达式,但我对重复信息有疑问,为了做一个更好的问题,我会提出我所拥有的和我想要的拥有:
所以我有一个文件:
Codes: C - Connected, S - Static, R - RIP, B - BGP,
O - OSPF IntraArea (IA - InterArea, E - External, N - NSSA)
A - Aggregate, K - Kernel Remnant, H - Hidden, P - Suppressed,
U - Unreachable, i - Inactive
O E 0.0.0.0/0 via 10.140, bond1.30, cost 1:10, age 5
via 10.141, bond1.31
via 10.142, bond1.32
O E 10.112/23 via 10.140, bond1.30, cost 46:1, age 2511
O E 10.112/23 via 10.140, bond1.30, cost 46:1, age 2511
O IA 10.138/29 via 10.140, bond1.30, cost 46, age 1029440
C 10.141/29 is directly connected, bond2.35
C 10.141/29 is directly connected, bond2.35
我做了这个正则表达式:
(S|R|B|O|A|K|H|P|U|i) +(IA|E|N|) +([0-9.]+)\/([0-9]+) +via +([0-9.]+), +([a-zA-Z0-9.]+|), +cost +([0-9]+:|)([0-9]+), +age +[0-9]+ +\n(( +via +([0-9.]+), +([a-zA-Z0-9.]+|) +\n)+|)
我的问题在于结尾部分(( +via +([0-9.]+), +([a-zA-Z0-9.]+|) +\n)+|),因为这个正则表达式让我明白了这个
array[0]=>' via 10.141, bond1.31
via 10.142, bond1.32';
array[1]=>'10.142';
array[2]=>'bond1.32';
但我想得到
array[0]=>'10.141';
array[1]=>'bond1.31';
array[3]=>'10.142';
array[4]=>'bond1.32';
我在关于正则表达式的页面中测试了正则表达式,其中一个告诉我:
注意:重复的捕获组只会捕获最后一次迭代。 在重复组周围放置一个捕获组以捕获所有 迭代或使用非捕获组,如果你不是 对数据感兴趣
但我真的不知道这是什么意思以及如何解决它。
注意:这是为了获取文件是关于 cisco 中路由的show ip route
更新 1
我将我的正则表达式更改为
(S|R|B|O|A|K|H|P|U|i) +(IA|E|N|) +([0-9.]+)\/([0-9]+) +via +([0-9.]+), +([a-zA-Z0-9.]+|), +cost +([0-9]+:|)([0-9]+), +age +[0-9]+ +\n(?: +via +([0-9.]+), +([a-zA-Z0-9.]+|) +\n)*
这样我就没有了
array[0]=>' via 10.141, bond1.31
via 10.142, bond1.32';
但我没有重复的部分
【问题讨论】:
-
您想获取第一个
OE部分的值吗?每个OE可以出现多少个via 10.141, bond1.31? -
未定义:/可以是无,一个或多个