0

増え続ける配列にドロップする必要のあるいくつかのデータを含むテキストファイルを解析しようとしています。「P1」という文字列の後に発生する測定値を見つけて配列に保存する必要があります。

値は正または負のいずれかになります(値とともに正または負の情報を保持する必要があります)。したがって、文字列の後に空白の文字数が含まれるように正規表現を設定することはできません。また、「エラー」という名前のセクションには、テキストファイルによってはさらに多くの行が含まれる場合があります...

念のために言っておきますが、私は特定のテキストを見つけて真または偽の値を返す以外の目的で正規表現を使用したことはありません...したがって、私はこれに非常に慣れていない/方法がわかりません。「P1:」以降のテキストを見つけて保存する方法を考えていたのですが、どう表現したらいいのかわかりません。

どんな助けでも素晴らしいでしょう...私は道に迷って学んでいます...しかしそれは私が望むほど速くは起こらず、私は少し立ち往生しています。

ありがとう!私は助けに感謝します。

エル

4

3 に答える 3

0

これがあなたの正規表現です:^\s*P1:\s+[\-\d\.]+,\s+([\-\d\.]+,\s+[\-\d\.]+)\s*$

この例から学ぶことができるように、分解してみましょう。

^行頭を意味します

\s*あなたはそれらを無視したいのですが、そこにあるかもしれません(ちょうど良い習慣です)

P1:あなたが探しているものです

\s+P1 とそれに続く数字の間に任意の数 (少なくとも 1 つ) のスペースを許可する

[\-\d\.]+あなたの番号を検出する最も簡単な方法です。ここでは、提供された入力が正しいと仮定しています。そうでない場合は、もう少し複雑にします\-?\d+(\.\d+)?(これは、12、-1、12.01、-11.21 などの数値と一致し、-0 も同様です)。

,\s+1 つ以上のスペースを含むカンマが最初の数字の後に続きます

([\-\d\.]+,\s+[\-\d\.]+)2 番目と 3 番目の数字は探しているもので、コンマといくつかのスペースで区切られています。

スペースが常に 1 つだけであることが確実にわかっている場合は、おそらく \s+ は必要ありません。次のように、代わりにスペースを使用します。([\-\d\.]+, [\-\d\.]+)

\s*末尾の空白を無視するのに役立ちます。

$行の終わりを表します

そして、これがあなたのコードです(Perl):

while (<>)
{
    chomp;
    s/^\s+|\s+$//g;
    print "$1\n" if ($_ =~ m/^\s*P1:\s+[\-\d\.]+,\s+([\-\d\.]+,\s+[\-\d\.]+)\s*$/);
}

もう少し普遍的にするにP1は、パラメーターを作成します。

my $pattern="P1"; # or $pattern = shift;

while (<>)
{
    chomp;
    print "$1\n" if ($_ =~ m/^\s*$pattern\:\s+[\-\d\.]+,\s+([\-\d\.]+,\s+[\-\d\.]+)\s*$/);
}

楽しみ!

于 2012-07-02T15:55:32.620 に答える
0

マシンが生成するフォームによって異なります。その均一な場合、ラインを見つけるために必要なのは^[^\S\n}*P1:. 周囲のテキストなど、ランドマークを使用するように拡張できます。これにより、その場所がさらに明確になります。

使用する修飾子: no-dotall('.' は改行以外のすべてに一致)、複数行 ('^' 行頭、'$' 行末)。

これは、ファイル全体を文字列に読み込むことを前提としています。現代のメモリを使用してこれを行う必要はありません。行ごとにこれを行いたい場合は、正規表現を交互に分割して、各一致が最終的に有効な行につながるレベルになるようにします... Centration: (level1), E0: (level2), P1: (level3)、level1 && level2 && level3 の場合、有効。または、何でも。

圧縮された

^[^\S\n]*Centration:.*\n+^[^\S\n]*E0:.*\n+^[^\S\n]*P1:[^\S\n]*[+-]?[\d.]+[^\S\n]*,[^\S\n]*([+-]?[\d.]+)[^\S\n]*,[^\S\n]*([+-]?[\d.]+)[^\S\n]*$

エキスパンド

^ [^\S\n]*  Centration: .* \n+
^ [^\S\n]*  E0: .* \n+
^ [^\S\n]*  P1: [^\S\n]*  [+-]?[\d.]+  [^\S\n]* ,   # distance
                [^\S\n]* ([+-]?[\d.]+) [^\S\n]* ,   # x  - capture grp 1
                [^\S\n]* ([+-]?[\d.]+) [^\S\n]* $   # y  - capture grp 2
于 2012-07-02T16:24:06.067 に答える
0

P1これは、3 つの数値をキャプチャする行と一致します。

P1: (-?\d+\.\d+), (-?\d+\.\d+), (-?\d+\.\d+)
  • (…<code>) はキャプチャ グループです。
  • -?オプションにマッチ-
  • \d+1 つ以上の数字 (0 ~ 9) に一致します
  • \.リテラルに一致.
于 2012-07-02T15:32:36.820 に答える