2

このサイトを約 2 時間検索したことをお約束します。機能するはずのものがいくつか見つかりましたが、機能しませんでした。

スペースで区切られたさまざまな量の数字で構成される行があります。3 番目以降の番号をすべて削除したい。

私が書いてきたことはすべて\S\s\S\s\S、最初の 3 つの数字に一致することを前提としていたと言わざるを得ません。1 と 2 の間、および 2 と 3 の間にスペースを入れます。

私は次の作業を期待していました:

s/^.*?[\S\s\S\s\S].{5}//s;

しかし、それは私が望んでいたこととは正反対でした。

2 3 0 4 5 6 7 1 0 1 2なりたい2 3 0

私はそれを代用し続けることを本当に望んでいます。ある人が言ったように、後読みを試みましたが、うまくいきませんでした。これらのコマンドを試す前に、最初の 3 つの数字を文字列として保存する必要がありますか?

編集:

これらの数値は 1.57 または 1.00E01 の形式でもよいことを明確にする必要がありました。それをベースライン作業だけにしようとしていたとき、整数がありました。

4

4 に答える 4

5
于 2012-08-08T18:05:58.510 に答える
1

したがって、最初の 3 つの数字を明示的に一致させ、それ以外はすべて削除します。

s/^([\dE.]+)\s+([\dE.]+)\s+([\dE.]+).*$/$1 $2 $3/;

これは次のように機能します。

$ perl -MYAPE::Regex::Explain -E 'say YAPE::Regex::Explain->new(q{^([\dE.]+)\s+([\dE.]+)\s+([\dE.]+).*$})->explain;'
The regular expression:

(?-imsx:^([\dE.]+)\s+([\dE.]+)\s+([\dE.]+).*$)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [\dE.]+                  any character of: digits (0-9), 'E', '.'
                             (1 or more times (matching the most
                             amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  \s+                      whitespace (\n, \r, \t, \f, and " ") (1 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  (                        group and capture to \2:
----------------------------------------------------------------------
    [\dE.]+                  any character of: digits (0-9), 'E', '.'
                             (1 or more times (matching the most
                             amount possible))
----------------------------------------------------------------------
  )                        end of \2
----------------------------------------------------------------------
  \s+                      whitespace (\n, \r, \t, \f, and " ") (1 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  (                        group and capture to \3:
----------------------------------------------------------------------
    [\dE.]+                  any character of: digits (0-9), 'E', '.'
                             (1 or more times (matching the most
                             amount possible))
----------------------------------------------------------------------
  )                        end of \3
----------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

(OPが元の仕様に加えた変更を考慮して更新されました。)

于 2012-08-08T17:58:49.040 に答える
1

s/^.*?[\S\s\S\s\S].{5}//s; 私が次のように書くとあなたが言うあなたのコード:s/^(\S\s\S\s\S).*$/$1/ 保持したい置換の一部をキャプチャするために $1 を使用するのを忘れており、先頭に .* があると、末尾の数字ではなく開始番号が削除される可能性があります. また、1 桁の数字または 1 つの空白文字の保証があるかどうかはわかりません。そのため、s/^(\S+\s+\S+\s+\S+).*$/$1/すべてのスペースとすべての数字をキャプチャするコードを記述できます。もう少し明確にする必要があるかどうか教えてください。

これは、Perl 正規表現に非常に役立つ Web サイトです: http://pubcrawler.org/perl-reference.html

于 2012-08-08T18:02:35.810 に答える
1

質問は、なぜ正規表現でそのようなことをしたいのですか? それは私には簡単に思えます:

substr $string, 5;

またはあなたが本当にしたい場合(私はテストしませんでした):

s/^(.{5})(.*)/$1/

括弧を使用すると、パターンを「覚える」ことができます。これは、ほとんどすべてをパターンの最初の部分 (最初の 5 文字) だけに置き換えたいと言う方法です。このパターンは、テキストの任意の行に一致し、最初の 5 文字のみを残します

于 2012-08-08T18:03:12.797 に答える