所以我有来自游戏服务器的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)
答案 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