【问题标题】:Non-Greedy regex acts greedy based on the position of atoms in regex非贪婪正则表达式根据正则表达式中原子的位置进行贪婪行为
【发布时间】:2015-08-25 10:40:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: regex tcl non-greedy


    【解决方案1】:

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

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

    (强调我的)

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

    【讨论】:

    • 哦,太好了,在回答时重新阅读它以备记忆,但没有发现Device\s+... 中的第一个运算符是贪婪的。所以如果我理解得很好,将第一个 \s+ 更改为 \s+? 应该可以吗?
    • @Tensibai & @glenn:是的!对于Device\s+?ID:.*?outgoing\s+port\):\s+,它只匹配到第一次出现。这很棒。感谢格伦先生!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多