3


$line='55.25040882, 3,,,,,,'私は現在、すべての空白と繰り返されるコンマとピリオドを削除したい 文字列、たとえば を持っています。現在、私は持っています:

    $line =~ s/[.,]{2,}//;
    $line =~ s/\s{1,}//;

私が得るように、これはうまくいきます'55.25040882,3'が、試してみると

$line =~ s/[.,\s]{2,}//;

「、」を抜いて、「、、、、、、」を残します。最初のコンマを保持し、空白だけを取り除きたいです。
1行の正規表現でこれをエレガントに行う方法はありますか? 追加情報を提供する必要がある場合はお知らせください。

編集:非常に多くの解決策があったため、以下の回答で質問を更新することにしました:

$line =~ s/([.,])\1{1,}| |\t//g;

これにより、繰り返されるすべてのピリオドとコンマが削除され、すべてのスペースとタブが削除されますが、\r および \n 文字は保持されます。やり方はいろいろありますが、私はこれに落ち着きました。本当にありがとう!

4

2 に答える 2

3

これは主にRohitの答えに対する批判であり、文字クラスの構文、特に否定演算子(^)に関するいくつかの誤解が含まれているようです。具体的には:

  • [(^\n^\r)\s]改行()およびキャリッジリターン()を含む(、または^または)または任意の空白文字に一致します。実際、クラスは一度に1文字しか消費しませんが、それぞれ2回指定されています(それらも一致するため)。\n\r\s

  • ^[\n\r]|\s文字列の先頭にある改行またはキャリッジリターン、または任意の空白文字に一致します(空白文字には改行とキャリッジリターンが含まれ、どこにも文字列の先頭が含まれるため、最初の部分が冗長になります)。

キャラクタークラス内では、カレット( )は、オープニングの直後に表示される場合^に続くすべての意味を否定します。他のどこでも、それはただのカレットです。他のすべてのメタ文字は、文字クラス内で完全に特別な意味を失います。(ただし、通常は非特殊文字、および、は特殊になります。)[\-]

キャラクタークラスの外に^は、アンカーがあります。


正規表現の書き方は次のとおりです。

$line =~ s/([.,])\1+|\h+//g;

説明:

  • ついにで行ったので、やのようなものではなく、繰り返されるピリオドまたは繰り返されるコンマ([.,])\1{1,}に一致させたいと思います。正規表現で成功するということは、正規表現エンジンと同じようにテキストを見る方法を学ぶことを意味し、直感的ではありません。正規表現エンジンが話すことができれば、各問題を正規表現エンジンのように説明しようとすると、非常に役立ちます。.,,.

  • {1,}は正しくありませんが、同じことを行うのに、なぜそのすべての雑然としたものを正規表現に追加する+のですか?

  • \hスペースとタブを含む水平方向の空白に一致しますが、改行や改行は含まれません。(これはPerl、AFAIKでのみ機能します。Ruby/鬼車で\hは16進数に一致します。私が知っている他のすべてのフレーバーでは、構文エラーです。)

于 2012-10-14T04:43:27.467 に答える
2

次を使用して試すことができます: -

my $line='55.25040...882, 3,,,,,,';
$line =~ s/[^\S\n\r]|[.,]{2,}//g;  # Negates non-whitespace char, \n and \r
print $line

出力: -

55.25040882,3
  • [^\S\n\r]|[.,]{2,}-> これは、[^\S\n\r]または[.,]{2,}
  • [.,]{2,}-> これは、置換,または同じ行に.複数ある場合を意味します。2
  • [^\S\n\r]whitespace character-> 、改行、および改行をすべて無効にすることを意味します。
于 2012-10-13T21:29:17.017 に答える