2

私はの新人ですPerl。私はこの形式の文字列を持っています:
[ timestamp | integer | string ] Some other string here

サンプル文字列:

[ 2013/05/28 21:39:02 | 2212 | MALFUNCTION  ] Please check for malfunction

timestampは実際にはタイムスタンプです。たとえば、2013/05/28 20:38:02
整数は数値であり、文字列は一連の単語から特定の単語にすることができます。
これの文字列部分を抽出することに興味があります。

Java私はそれを次のように簡単にします :

String s = sentence.substring(line.lastIndexOf("|") + 1, line.lastIndexOf("]")).trim();  

これは、文字列を 1 文字ずつループして、対象の部分を取得するだけです。
しかし、この種の「問題」がどのように解決されるかはわかりませんPerl
どうすればいいですか?正規表現のみ?

4

5 に答える 5

9

正規表現である必要はありませんが、Perl では非常に便利です。

my $str = "[ timestamp | integer | string ] Some other string here";
my ($timestamp, $integer, $string, $other)
   = ($str =~ /\[(.*?)\|(.*?)\|(.*?)\](.*)/);
于 2013-05-28T18:52:37.587 に答える
3

一致する文字列に他の縦棒が含まれていない場合は、正規表現を使用できます。

$fullstring = '[ timestamp | integer | string ] Some other string here';
($string) = ($fullstring =~ /\| *([^|\]]*?) *]/);
于 2013-05-28T18:52:53.417 に答える
2

正規表現は自然な Perl っぽいやり方です。この場合、最後の '|' の間の文字列が必要です。および最初の ']' から周囲の空白を除いたもの。

my $string = ($line =~ m/
    \|  #The | character
    \s* #Arbitrary whitespace
    (   #Capture
        [^\|\]]*? #Some number of characters that are not | or ]
    )
    \s* #More whitespace
    \]  # The ] character
    /x)[0];

イディオム(m/(reg)ex/)[0]は、正規表現から最初のキャプチャ グループを抽出するために使用されます。それ以外の場合は、キャプチャ グループの配列が返され、スカラー (配列の長さ) に変換されます。

正規表現の/x修飾子により、空白と #comments が無視されます。

正規表現内の*?トークンは、「貪欲でない」マッチングを意味します。そうしないと、末尾の空白もキャプチャされます。

于 2013-05-28T19:02:19.760 に答える
1

行は、文字で分割し|[]、抽出された値のスペースをトリミングすることで解析できます

my @arr = map { s/^\s+ | \s+$//xg; $_ }  split / [\Q[]|\E] /x, $line;

その後$arr[0]は is timestamp $arr[1]isintegerなどです。

于 2013-05-28T18:49:44.623 に答える