Соответствие регулярному выражению до появления строки - PullRequest
0 голосов
/ 13 августа 2011

Итак, у меня есть этот файл, содержащий более 10000 строк сообщений с игрового сервера, например:

11.07.23 08:40:16 [INFO] NC: нарушение при движении: wolfman98 from yasmpРасстояние (от -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: нарушение движений: AKxiZeroDark from yasmp(-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: нарушение движений: wolfman98 от yasmp (- 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: нарушение перемещения: wolfman98 из yasmp (- #,#, #) до (- #, #, #) расстояние (0,0, 0,0, 0,2)

11.07.23 10:57:44 [INFO] NC: перемещениенарушение: AKxiZeroDark от yasmp (- #, #, #) до (- #, #, #) расстояние (0,0, 0,0, 0,0)

И немного дополнительной информации, числа могут быть либо отрицательными, либо нет, в диапазоне от 1,0 до 1234,0 цифр, поэтому мне нужна помощь в сопоставлении перед словом «расстояние».

РЕДАКТИРОВАТЬ: Или даже, было бы хорошо, если бы все это не показывалось:

11.07.23 08:40:16 [INFO] NC: нарушение движения: wolfman98 с расстояния yasmp (0.0, 0.0, 0.2)

11.07.23 10:57:44 [INFO] NC: нарушение движения: AKxiZeroDark от расстояния yasmp (0,0, 0,0, 0,0)

Ответы [ 4 ]

3 голосов
/ 13 августа 2011

Регулярное выражение довольно волосатого вида, расширяющее число, совпадающее с регулярным выражением числа, будет \((?:-?\d{1,4}\.\d{1}(?:, |\))){3} to \((?:-?\d{1,4}\.\d{1}(?:, |\))){3}(?= distance). Давайте разберемся с этим немного.

Он состоит из двух идентичных групп, соответствующих двум группам чисел в скобках: \((?:-?\d{1,4}\.\d{1}(?:, |\))){3}. Регулярное выражение теперь допускает необязательный - перед числом, что делает число совпадающим -?\d{1,4}\.\d{1}. После каждого числа стоит запятая или пара, поэтому для итерации по номеру нам также нужно это: (?:, |\)). Весь этот зверь затем ставится с префиксом \(, чтобы получить начальную фамилию группы чисел. Это регулярное выражение повторяется дважды, чтобы получить две группы чисел с to соответствием между ними.

Последний бит является положительным прогнозом, чтобы убедиться, что мы сопоставляем группы номеров, за которыми следует слово distance. Это слово не будет включено в совпадение, но оно должно быть там, чтобы регулярное выражение соответствовало.

Я использовал группы без захвата (материал (?: ... )), потому что я не знаю, что вы хотите делать с захватами.

Я опробовал это на двух ваших примерах строк файла журнала, используя perl 5.12.2, и похоже, что он работает.

0 голосов
/ 13 августа 2011

Похоже на работу для 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

Или как однострочник с более простыми регулярными выражениями.Просто удалите первые две пары, независимо от того, что они содержат:

perl -pwe 's/ \([^)]+\)//; s/ \([^)]+\)//;' input.txt 
0 голосов
/ 13 августа 2011
/(?:\-|\b)\d{1,4}.\d{1}\b(?=.*distance)/

Соответствует нужным числам (проверено в PHP).

0 голосов
/ 13 августа 2011

Вы хотите сопоставить от начала (, открывающего последовательность, до конца ) до расстояния.

Не проверенное, может быть слишком широкое регулярное выражение может быть: \([-0-9., ]+\) to \([-0-9., ]+\), но это может соответствовать вещам, которые вам не нужны.

...