我有一个拼图为你regexp-gods在那里。 :)
我非常困惑,通过这个常规延期:
^.*DST=(?<DST>[^ ]*).*(?:TTL=(?<TTL>[^ ]*))?.*PROTO=(?<PROTO>[^ ]*).*$
我有这个测试字符串:
Oct 24 11:43:29 127.0.0.1 kernel: [22592645.391497] WATCH IN=eth0 OUT= MAC=ff:ff:ff:ff:ff:ff:a0:48:1c:55:50:70:08:00 SRC=10.10.1.1 DST=255.255.255.255 LEN=267 TOS=0x10 PREC=0x00 TTL=16 ID=0 PROTO=UDP SPT=3490 DPT=3490 LEN=247
我希望匹配DST,TTL和PROTO值,而TTL值是可选的,可以在另一行中省略。
然而,如果将TTL组设置为可选,则TTL组不匹配。正如我所理解的那样,它应该是贪婪的,所以当有一个TTL组时,它应该匹配。我所看到的是,* -token看起来比贪得无厌。我试着让* -token懒惰,但那也没有用。
有人可以向我解释一下吗?
感谢。
亲切的问候
丹尼斯
答案 0 :(得分:1)
您需要移动非捕获组内的.*
,使其成为可选项。
^.*DST=(?<DST>[^ ]*)(?:.*TTL=(?<TTL>[^ ]*))?.*PROTO=(?<PROTO>[^ ]*).*$
你可以使用\S
代替否定的字符类,如果你喜欢哪个匹配任何非空白字符,我会避免使用*
并使用+
代替前几个一个非贪婪的量词+?
。
^.+?DST=(?<DST>\S+)(?:.+?TTL=(?<TTL>\S+))?.+?PROTO=(?<PROTO>\S+).+$
我建议您阅读文章"The Greedy Trap"以了解其中的差异。
答案 1 :(得分:0)