简单的正则表达式打印字符串中的特定条目
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 由您决定。
我有一个日志文件,其中包含如下所示的条目:
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 由您决定。