我遇到了一个情况,我想在正则表达式模式中使用非贪婪原子.*?
。
set input "Device ID: HOST1
Interface: GigabitEthernet0/1, Port ID (outgoing port): GigabitEthernet2/43
Device ID: HOST2
Entry address(es):
Interface: GigabitEthernet0/2, Port ID (outgoing port): GigabitEthernet2/43
"
puts "======== Non-Greedy regex starting with some other patterns ========"
puts [ regexp -inline {Device\s+ID:.*?outgoing\s+port\):\s+} $input]
puts "======== Non-Greedy regex at first ========"
puts [ regexp -inline {.*?outgoing\s+port\):\s+} $input]
输出:
======== Non-Greedy regex starting with some other patterns ========
{Device ID: HOST1
Interface: GigabitEthernet0/1, Port ID (outgoing port): GigabitEthernet2/43
Device ID: HOST2
Entry address(es):
Interface: GigabitEthernet0/2, Port ID (outgoing port): }
======== Non-Greedy regex at first ========
{Device ID: HOST1
Interface: GigabitEthernet0/1, Port ID (outgoing port): }
当.*?outgoing\s+port\):\s+
匹配到第一次出现的时候,模式Device\s+ID:.*?outgoing\s+port\):\s+
并没有停止在第一次匹配出现的位置。
为什么非贪婪匹配的行为会受到原子放置的影响?
Device\s+...
中的第一个操作符是贪婪的。所以如果我理解得没错的话,将第一个\s+
改为\s+?
就可以了? - TensibaiDevice\s+?ID:.*?outgoing\s+port\):\s+
,它只匹配到第一个出现的位置。这太好了。感谢Glenn先生!!! - Dinesh