12

より広いコンテキストで必要なものに一致するキャプチャ グループを含む正規表現があります。次に、キャプチャ グループを取得$1し、必要に応じて使用します。簡単だ。

しかし、正規表現全体ではなく、s///のコンテンツを置き換えたい場合にキャプチャ グループを使用するにはどうすればよいでしょうか。$1

たとえば、次のようにします。

$str =~ s/prefix (something) suffix/42/

prefix削除されsuffixます。代わりに、そのままにしておきながら、somethingに置き換えたいと思います。42prefixsuffix

4

5 に答える 5

19

私が理解しているように、文字を消費しない先読みまたは後読みを使用できます。または、データをグループに保存して、探しているものだけを削除します。例:

先読みあり:

s/your_text(?=ahead_text)//;

データのグループ化:

s/(your_text)(ahead_text)/$2/;
于 2012-08-26T15:07:19.173 に答える
3

1つのキャプチャのみを置き換える必要がある場合は、@LAST_MATCH_STARTand @LAST_MATCH_END(with use English;を参照perldoc perlvar)を一緒に使用substrすることが実行可能な選択肢になる可能性があります。

use English qw(-no_match_vars);
$your_string =~ m/aaa (bbb) ccc/;
substr $your_string, $LAST_MATCH_START[1], $LAST_MATCH_END[1] - $LAST_MATCH_START[1], "new content";
# replaces "bbb" with "new content"
于 2012-08-26T15:09:51.763 に答える
1

>somethingこれは古い質問ですが、 toで始まる行を置き換えるには、以下の方が簡単であることがわかりました>something_else。fasta シーケンスのヘッダーを変更するのに適しています

  while ($filelines=~ />(.*)\s/g){
        unless ($1 =~ /else/i){
                $filelines =~ s/($1)/$1\_else/;
        }

  }
于 2013-04-19T17:39:23.070 に答える
0

私は次のようなものを使用します:

s/(?<=prefix)(group)(?=suffix)/$1 =~ s|text|rep|gr/e;

例:

次のテキストでは、空白を正規化したいのですが、の後にのみ::=:

some    text     := a   b        c d   e   ;

これは次の方法で実現できます。

s/(?<=::=)(.*)/$1 =~ s|\s+| |gr/e

結果:

some    text     := a b c d e ;

説明:

(?<=::=): 照合する後読みアサーション::=

(.*): 以降すべて::=

$1 =~ s|\s+| |gr: キャプチャされたグループで空白を正規化します。読み取り専用のr変更を試みないようにする修飾子に注意してください。$1別のサブ区切り文字 ( |) を使用して、置換式を終了しないでください。

/e: 置換テキストを perl 式として扱います。

于 2021-05-12T10:02:29.167 に答える