2015-06-10 51 views
2

我遇到了一种情况,我想在正则表达式中使用非贪婪原子.*?非贪婪正则表达式基于正则表达式中的原子位置贪婪

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+不是在比赛的第一个发生停止。

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

回答

3

这并不是说有据可查(IMO),但the re_syntax man page说这大约贪婪/非贪婪偏好:

甲支路具有相同的优先级为在它的第一量化原子具有的偏好。

(重点煤矿)

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

+1

呵呵,很好的回答,在回答时重新阅读它的记忆,但没有发现第一个操作符在'Device \ s + ...'中贪婪。所以如果我做得好,把第一个'\ s +'改成'\ s +?'应该做什么? – Tensibai

+0

@Tensibai&@glenn:是的!使用'Device \ s +?ID:。*?outgoing \ s + port \':\ s +'它只匹配到第一个匹配项。这很棒。感谢格伦先生! – Dinesh