字符串出现前的正则表达式匹配

时间:2011-08-13 07:49:57

标签: regex string-matching

所以我有来自游戏服务器的10,000多行消息的文件,如下所示:

  

11.07.23 08:40:16 [INFO] NC:移动违规:来自yasmp的wolfman98   (-90.8,64.0,167.5)到(-90.7,64.0,167.3)距离(0.0,0.0,0.2)

     

11.07.23 10:57:44 [INFO] NC:移动违规:来自yasmp的AKxiZeroDark   (-1228.3,11.2,1098.7)到(-1228.3,11.2,1098.7)距离(0.0,0.0,   0.0)

我目前使用的正则表达式代码是:\d{1,4}\.\d{1},到目前为止所有内容都以粗体显示:

  

11.07.23 08:40:16 [INFO] NC:移动违规:来自yasmp的wolfman98( - 90.8 64.0 ,<强度> 167.5 )至( - 90.7 64.0 167.3 )距离( 0.0 0.0 0.2

我一直无法找到一种方法来获得仅仅说:

的部分
  

( - 1228.3,11.2,1098.7)至(-1228.3,11.2,1098.7)

在“距离”字之前,并且在开头没有时间戳,并最终将其替换为最终结果如下:

  

11.07.23 08:40:16 [INFO] NC:移动违规:来自yasmp的wolfman98   ( - #,#,#)( - #,#,#)距离(0.0,0.0,0.2)

     

11.07.23 10:57:44 [INFO] NC:移动违规:来自yasmp的AKxiZeroDark   ( - #,#,#)( - #,#,#)距离(0.0,0.0,0.0)

还有一些额外的信息,这些数字可以是负数,也可以是负数,范围从1.0到1234.0,这就是为什么我需要在“距离”之前再次匹配帮助。

编辑:或者,如果整个事情没有出现就没问题了:

  

11.07.23 08:40:16 [INFO] NC:移动违规:来自yasmp的wolfman98   距离(0.0,0.0,0.2)

     

11.07.23 10:57:44 [INFO] NC:移动违规:来自yasmp的AKxiZeroDark   距离(0.0,0.0,0.0)

4 个答案:

答案 0 :(得分:3)

一个相当毛茸茸的正则表达式扩展了你的数字匹配正则表达式\((?:-?\d{1,4}\.\d{1}(?:, |\))){3} to \((?:-?\d{1,4}\.\d{1}(?:, |\))){3}(?= distance)。让我们稍微打破一下。

它由两组完全相同,以匹配parens中的两组数字:\((?:-?\d{1,4}\.\d{1}(?:, |\))){3}。正则表达式现在允许在数字前面加上-,并使数字匹配-?\d{1,4}\.\d{1}。在每个数字后面都有一个逗号或一个paren,所以要迭代我们需要的数字匹配:(?:, |\))。然后整个野兽都以\(为前缀,以获得数字组的开头数。该正则表达式重复两次以获得两组数字,其中to匹配。

最后一位是积极的预测,以确保我们匹配单词distance后面的数字组。该单词不会包含在匹配中,但必须在那里才能使正则表达式匹配。

我使用过非捕获组((?: ... )的东西)因为我不知道你想用捕获做什么。

我已经使用perl 5.12.2对你的两个示例日志文件行进行了尝试,它似乎有效。

答案 1 :(得分:0)

您需要从打开序列的(的开头到距离之前的)的末尾进行匹配。

未经检查,可能过于宽泛的正则表达式可能是:\([-0-9., ]+\) to \([-0-9., ]+\)但可能与您不想要的内容相匹配。

答案 2 :(得分:0)

/(?:\-|\b)\d{1,4}.\d{1}\b(?=.*distance)/

匹配您想要的数字(在PHP中测试)。

答案 3 :(得分:0)

听起来像perl的工作:

use strict;
use warnings;
use ARGV::readonly;

my $rx = qr/\([0-9,\.\- ]+\)/;

while (<>) {
    s/ $rx to $rx( distance $rx\s*)$/$1/;
    print;
}

用法: script.pl input.txt > output.txt

或者作为一个简单的正则表达式的单行。只需删除前两个parens,无论它们包含什么:

perl -pwe 's/ \([^)]+\)//; s/ \([^)]+\)//;' input.txt