2

私はPerlで次のような正規表現を持っています:

\s{2,}(?<name>(\S+\s)*\S+)\s{2,}

$+{name}正規表現内の名前付きキャプチャの長さを確認する方法はありますか?

指定された最大長の値のみを一致させたい。

たとえば$+{name}、最大 27 文字になりたいとします。

このケースはルックアラウンドを使用して実行できると思いますが、私はまだこの方法に慣れていません。

次に例を示します。

私はこのデータを持っています:

ROTINSON, JABON                                          0.000
CHUNG, TSONH-HIW                                                           0.000
ROBINSONS, VISTOR R                                                                 0.000

表示される名前は ((\S+\s)*\S+) で一致します。可能であれば、正確に 27 文字を正規表現でキャッチする必要があります。これが列に必要な最大長だと思うからです。

表示される数値は異なる列にある必要があり、1 つの列に追加する必要がある値を正確に見つけたいなどです。このファイルは固定幅ファイルではないため、すべての値が正確に同じ数のスペースで区切られるわけではありません。いくつかの小さなバリエーションがあります。

今までこれを試合に使用していましたが、思ったように機能していません:

/^\s{0,8}(?P<name>(\S+\s){0,5}\S+)
\s{10,70}(?P<value>\d+\.\d+)
\s*$/xi
4

2 に答える 2

4

正規表現は万能薬ではなく、この場合は間違った選択です。文字列を複数の空白文字で分割し、長すぎる部分文字列を拒否する必要があります。

このプログラムはそれを示しています:

use strict;
use warnings;
use 5.010;

my $st = '  aaa aa aa  2long 2long 2long 2long 2long  bb bbb bb  cc cc ccc  ';

say for grep { $_ and length $_ <= 27 } split /\s{2,}/, $st;

出力

aaa aa aa
bb bbb bb
cc cc ccc
于 2013-09-17T12:09:04.997 に答える