2011-02-06 6 views
-1

Я не слишком хорошо знаком с регулярным выражением, но я знаю, что мне нужно найти.Задайте вопрос специалисту Regex!

У меня есть длинный список данных, разделенных символами новой строки, и мне нужно удалить все строки данных, содержащие строку "(В)». Линии имеют переменную длину, поэтому я предполагаю, что что-то делать с выбором всего между двумя символами новой строки, если внутри есть (V)?

+3

Какой язык или инструмент вы используете? –

+0

Как долго длинный список? Достаточно ли он достаточно мал, чтобы вписаться в вашу доступную физическую память несколько раз? Если это так, это не «долго», и вы можете обрабатывать партию в памяти просто отлично. Если нет, время для использования линейной обработки. (Для некоторых языков, например, Perl, строка за строкой имеет смысл.) –

ответ

1

Попробуйте искать для этого регулярного выражения:

^.*\(V\).*$ 

Объяснение:

 
^ start of line 
.* any characters apart from new line 
\( open parenthesis (escaped to avoid special behaviour) 
V V 
\) close parenthesis (escaped to avoid special behaviour) 
.* any characters apart from new line 
$ end of line (not strictly need here, included only for clarity) 

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

Вот онлайн пример, показывающий его работать: Rubular

1

Если данные действительно довольно большой, то работает один регулярное выражение против целой строки будет плохой идеей. Вместо этого простое решение, как этот скрипт на Perl может работать для вас:

open my $fh, '<', 'data.txt' or die $!; 
while (my $line = <$fh>) { 
    if ($line =~ m/\(V\)/) { 
     next; 
    } 
    print $line; 
} 
close $fh; 

Этот скрипт считывает данные в файл по одной строке за раз и печатает строки, которые не содержат «(V)» на стандартный вывод. (Очевидно, вы могли бы заменить «печать» другой задачей обработки данных).

1

Используйте команду UNIX grep, если у вас есть доступ к такой системе.

$ grep -v '(V)' data.txt 

Grep соответствует все строки, содержащие "(V)" в data.txt, и показывает только линии, не соответствующие (-v).

Смежные вопросы