正規表現は、ターゲット文字列内の任意の場所でパターンを検索することを除いて、基本的には問題ありません。つまり、有効な時刻が1つ含まれている文字列はすべて一致します。文字列アンカーの開始と終了を追加し、文字列全体をパターンに一致させる必要があり^
ます$
。
最初に共通部分式を記述してから、それをサブルーチンのように使用すると、正規表現をより明確かつ簡単にコーディングできるようになります。また、/x
修飾子を使用すると、空白を使用して表現をより明確にレイアウトできるようになります。
たとえば、これは単一の時間文字列に一致します
/ ( [0-1][0-9] | 2[0-3] ) [0-5][0-9] /x
そして、メイン式でそれを2回置き換えることができます。
(?: ... )
部分文字列を本当にキャプチャしたい場合を除いて、の$1
ようにキャプチャしない括弧を使用することもお勧めします$2
。
このプログラムを見て、あなたの考えを見てください
use strict;
use warnings;
my $time = qr/(?: (?: [0-1][0-9] | 2[0-3] ) [0-5][0-9] ) /x;
while (<DATA>) {
print if /^ $time (?: ,[ \t]* $time )* $/x;
}
__DATA__
1245
0056, 1034,2355
1235, 4711
0000,1111
出力
1245
0056, 1034,2355
0000,1111