可変長バイパス Perl Negative Lookbehindは可能ですか?

可変長バイパス Perl Negative Lookbehindは可能ですか?

この簡単なコードがあります

perl -we 'my $file= "
    #    parameter=10
#    parameter=10
# parameter=10
    parameter=10
parameter=10
"; $file=~ s/((?<!# ))\s*parameter\s*=.*/parameter=replaced/g; print(":$file:\n")'

すべてのパラメータ= 10を置き換えたいが、その行のどの位置でもハッシュが前にある場合はそうではありません。例えば

        #    parameter=10
#    parameter=10
# parameter=10
        parameter=replaced
parameter=replaced

私が提供したらわかります

((?<!#\s*))

エラーが発生しました。

可変長の振り返りは正規表現では実装されません。

もしそうなら、タスクを実行する他の方法はありますか?

ありがとう

ベストアンサー1

次のことができます。

s/#.*|((?<!\S)parameter\h*=.*)/$1 ? "parameter=replaced" : $&/ge;

アイデアは#.*(私たちがそれを私たち自身のものに置き換える)すべてのコメントを噛んでしまうということです。置換の2番目の部分では、残りのコンテンツでパターンを探します(ここでparameter=...前にスペースがない場合)。

もう一つの方法は、次を使用することです。

s/^[^#\n]*\K(?!<\S)parameter\h*=.*/parameter=replaced/gm;

\K交換する断面の開始位置を設定します。このmフラグは、^タイトル内の各行の先頭で一致します。

行の先頭にしか見つからない場合parameter=(次にオプションのスペースが続く)、次のようになります。

s/^\h*\Kparameter\h*=.*/parameter=replaced/gm;

おすすめ記事