Regex: выбор символа конца строки строк, не содержащих 3 точки с запятой - PullRequest
0 голосов
/ 20 октября 2011

Я использую функцию поиска и замены Regex в EditpadLite. Мой документ выглядит так

20-10-2011;foo1;foo2;foo3;foo4;foo5
19-10-2011;foo1;foo2;foo3;foo4;
18-10-2011;foo1;foo2;foo3;foo4
17-10-2011;foo1;foo2;foo3;foo4;foo5
16-10-2011;foo1;foo2;foo3;foo4;
15-10-2011;foo1;foo2;foo3;foo4

проблема; каждая строка должна содержать 4; символы, поэтому строки 3 и 6 требуют дополнительной точки с запятой в конце строки, заменив \ n на; \ n. Я пробовал:

(?<!^.*;{3}.*$)\n

для выбора символов конца строки, которым не предшествует строка, содержащая ровно 3 точки с запятой. Однако это не работает, потому что, я думаю, точки с запятой не являются последовательными. Есть ли альтернатива этому?

Ответы [ 2 ]

2 голосов
/ 20 октября 2011
(^(?:[^;]+;){4}[^;]+$) 

должно соответствовать только строке 3 и 6

, просто замените соответствие на $1;

(  //start of group 1
  ^  //start of string
    (  //start of group 2
      ?:  //dont capture matches in group 2
      [^;]+;  //match one or more 'not semicolon' characters followed by a semicolon   
    ){4} //end of group 2, match group 2 exactly 4 times
    [^;]+  //after group 2 matched 4 times there should be one or more 'not semicolon' characters
  $ //end of string
) //end of group 1
1 голос
/ 20 октября 2011

Я бы использовал split и посчитал количество элементов.

Вот способ perl сделать это:

#!/usr/local/bin/perl 
use strict;
use warnings;

while(<DATA>) {
    chomp;
    my @l = split /;/;
    $_ .= ";" if @l == 5 && !/;$/;
    print "$_\n";
}

__DATA__
20-10-2011;foo1;foo2;foo3;foo4;foo5
19-10-2011;foo1;foo2;foo3;foo4;
18-10-2011;foo1;foo2;foo3;foo4
17-10-2011;foo1;foo2;foo3;foo4;foo5
16-10-2011;foo1;foo2;foo3;foo4;
15-10-2011;foo1;foo2;foo3;foo4

output:

20-10-2011;foo1;foo2;foo3;foo4;foo5
19-10-2011;foo1;foo2;foo3;foo4;
18-10-2011;foo1;foo2;foo3;foo4;
17-10-2011;foo1;foo2;foo3;foo4;foo5
16-10-2011;foo1;foo2;foo3;foo4;
15-10-2011;foo1;foo2;foo3;foo4;
...