2015-06-10 86 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