Regexp:Star覆盖贪婪的可选项

时间:2014-10-24 13:43:51

标签: regex regex-greedy

我有一个拼图为你regexp-gods在那里。 :)

我非常困惑,通过这个常规延期:

^.*DST=(?<DST>[^ ]*).*(?:TTL=(?<TTL>[^ ]*))?.*PROTO=(?<PROTO>[^ ]*).*$

Debuggex-Setup for that

我有这个测试字符串:

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懒惰,但那也没有用。

有人可以向我解释一下吗?

感谢。

亲切的问候

丹尼斯

2 个答案:

答案 0 :(得分:1)

您需要移动非捕获组内的.*,使其成为可选项。

^.*DST=(?<DST>[^ ]*)(?:.*TTL=(?<TTL>[^ ]*))?.*PROTO=(?<PROTO>[^ ]*).*$

你可以使用\S代替否定的字符类,如果你喜欢哪个匹配任何非空白字符,我会避免使用*并使用+代替前几个一个非贪婪的量词+?

^.+?DST=(?<DST>\S+)(?:.+?TTL=(?<TTL>\S+))?.+?PROTO=(?<PROTO>\S+).+$

我建议您阅读文章"The Greedy Trap"以了解其中的差异。

答案 1 :(得分:0)

这个怎么样?

^.*?DST=(?<DST>[^ ]*)(?:(?!TTL=).)*(?:TTL=(?<TTL>[^ ]*))?.*PROTO=(?<PROTO>[^ ]*).*$

DEMO

减少的,

^.*?DST=(?<DST>\S*)(?:(?!TTL=).)*(?:TTL=(?<TTL>\S*))?.*PROTO=(?<PROTO>\S*).*$

DEMO

(?:(?!TTL=).)*匹配任何字符,但不匹配TTL=零次或多次。