1

Perl の正規表現の学習に苦労しています。私は。。をしようとしています :

  • #行の先頭にある単一のすべての出現箇所を: に置き換えます#####
  • #文字の行全体 (先頭または末尾のスペースを無視) をすべて に置き換えます
    # ---------- #

私はそれを知っていますが、それs/#が私が知っているすべてであり、私が見つけることができるすべてです. 助言がありますか。

4

2 に答える 2

4

行頭は にマッチし^ます。したがって、a で始まる行#は、

/^#/

を単一にしたい場合#、つまり別の が続かない#場合は、負の文字クラスを追加する必要があります。

/^#[^#]/

に続く文字を置き換えたくない#ので、一致しないグループ (否定先読みと呼ばれる)に置き換えます。

/^#(?!#)/

置換を追加するには、次のように変更するだけです

s/^#(?!#)/#####/

行全体は、次の正規表現で照合できます。

/^#+$/

プラスは「1回以上」を意味し、^すでに$説明されています。先頭と末尾のスペース ( *「0 個以上」を意味します) を無視する必要があります。

/^ *#+ *$/

スペースを置き換えたくないので、それらを保持する必要があります。括弧は、1 から数えられる「キャプチャ グループ」を作成します。

s/^( *)#+( *)$/$1# ---------- #$2/
于 2013-05-02T14:01:16.853 に答える
2

最初の交換の場合:

$line =~ s/^#/#####/;

ここでの考え方は、「#」で始まる行が必要だということです。正規表現の '^' は、後に続くものが文字列の先頭になければならないことを示しています。

2 回目の交換の場合:

$line =~ s/^#+$/# ---------- #/;

これは再び「^」と「$」を使用します。末尾の '$' は、前に来るものは文字列の最後まで行かなければならないことを示しています。「#+」は、1 つ以上の「#」文字が必要であることを示します。つまり、文字列全体が「#」で構成されている必要があります。

テスト スクリプトと実行は次のとおりです。

$ cat foo.pl
#! /usr/bin/perl

use strict;
use warnings;

my @lines = (
        "foo line",
        "# single comment",
        "another line",
        "#############",
        "# line",
        "############",
);

foreach my $line( @lines ){
        print "ORIGINAL:  $line\n";
        $line =~ s/^#/#####/;
        $line =~ s/^#+$/# ---------- #/;
        print "NEW:       $line\n";
        print "\n";
}

$ ./foo.pl
ORIGINAL:  foo line
NEW:       foo line

ORIGINAL:  # single comment
NEW:       ##### single comment

ORIGINAL:  another line
NEW:       another line

ORIGINAL:  #############
NEW:       # ---------- #

ORIGINAL:  # line
NEW:       ##### line

ORIGINAL:  ############
NEW:       # ---------- #
于 2013-05-02T14:02:40.923 に答える