非贪婪的正则表达式基于正则表达式中原子的位置而贪婪

时间:2015-06-10 09:08:50

标签: regex tcl non-greedy

我遇到过一种情况,我想在正则表达式模式中使用非贪婪的原子.*?

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+并未在第一次出现匹配时停止。

为什么非贪婪匹配的行为会因原子的放置而受到影响?

1 个答案:

答案 0 :(得分:3)

这不是记录良好的(IMO),但是the re_syntax man page说贪婪/非贪婪的偏好:

  

分支与首选第一个量化原子具有相同的偏好。

(强调我的)

因此,如果你有.*作为第一个量词,整个RE将是贪婪的,
如果你有.*?作为第一个量词,整个RE将是非贪婪的。