0

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つのセミコロンを含む行が前にない行末文字を選択します。ただし、セミコロンは連続していないため、これは機能しません。これに代わるものはありますか?

4

2 に答える 2

2
(^(?:[^;]+;){4}[^;]+$) 

3 行目と 6 行目のみに一致する必要があります

match を$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
于 2011-10-20T11:44:17.050 に答える
1

分割を使用して、要素の数を数えます。

これを行う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

出力:

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;
于 2011-10-20T11:23:51.013 に答える