简单的正则表达式打印字符串中的特定条目

Simple REGEX to print specific entries from a string

我有一个日志文件,其中包含如下所示的条目:

2017-07-13 11:23:43.717948 [CRIT] mod_dptools.c:1713 SRC=7479569217;7479569217;768733974848304;7479569217;300067;333;-1

我正在尝试打印 ; 之间的特定值,这些值是数字(总是)。例如,我想打印 ;.

之间的第一个、第三个和第五个数字

我试过这个模式:

(?=;).+?(?=;).+?.+?(?=;)

它将打印第二和第三。不确定如何在不打印第三个的情况下打印第二个和第四个...

更新:

也许我不够清楚,或者这个例子不是最好的形式。所以让我添加更多信息:

2017-07-13 11:23:43.717948 [CRIT] mod_dptools.c:1713 SRC=123;1234567890;00000000;2222222;7479569217;87654321;300067;333;-1

我的预期输出是:123;00000000;7479569217;300067;333;-1

也就是说第一个数,然后是第三个,第五个,第六个,第七个,然后是第八个

如果我需要更改,例如只打印第 2、3、4 和 5 个条目,最好稍后 select。

尝试这样的事情:

=(-?\d+;)-?\d+;(-?\d+);-?\d+(;-?\d+)(;-?\d+)(;-?\d+)(;-?\d+)(;-?\d+)

已编辑

没注意到负号...

如果您信任日志文件中的数据并且不想验证您的值只包含 - 和数字,那么您可以只使用包含 [= 的否定字符 class 12=](这将提高模式效率)并且只用括号括起您想要的值。

模式:(Demo)

#not captured--vv------------vv
     =([^;]*;)[^;]*;([^;]*;)[^;]*;([^;]*;)([^;]*;)([^;]*;)([^;]*;)(.*)
                                                       

请注意,最后一个捕获组 (</code>) 使用点而不是负字符 class。这样模式就不会尝试匹配下一行。我认为这是一个重要的特性,因为您的日志文件中会有很多行数据。 (如果没有,最后的捕获组可以像之前的其他捕获组一样)</p> <p>我使用 <code>* 作为零或多个量词,以防日志文件可以在分号之间传递空值。如果日志文件始终包含每个值的数字,则 + 可用作量词。

如果您需要验证这些值,Usagi 的模式是合适的。

像这样合并我的捕获组:=([^;]*;)[^;]*;([^;]*;)[^;]*;([^;]*;[^;]*;[^;]*;[^;]*;.*)=([^;]*;)[^;]*;([^;]*;)[^;]*;((?:[^;]*;){4}.*) 成功地减少了捕获组的总数并提高了模式效率和简洁性,但使模式在未来更新起来稍微困难一些。更冗长的模式将使捕获组更改变得轻而易举。根据验证、效率、简洁性和可维护性,select 由您决定。