1

非常に基本的なシェルから Python へのコンバーターを作成しようとしていますが、変数の置換に問題があります。例、私が欲しい:

echo $var1 $var2 $var3
echo $var1 $var2 $var3 $var4

なる:

print var1, var2, var3
print var1, var2, var3, var4

現在、次のようになります。

print var1, var2 var3
print var1, var2 var3, var4

私の正規表現は次のとおりです。

$string =~ s/(\$[a-z]+[a-z0-9]*)(\s+\S+)/$1,$2/gi;

何らかの理由で、グローバル修飾子が設定されていても、一致した文字列の 2 番目の部分に正規表現を適用しません。

助けてくれてありがとう!

4

4 に答える 4

1

正規表現に近づけて、これを試してください:

use strict;
use warnings;

my $string = '$var1 $var2 $var3 $var4$var5';

$string =~ s/\$([a-z][a-z0-9]*)\s*/$1, /gi;
$string =~ s/,\s*$//; #removing trailing comma
print $string . "\n";

出力:

var1, var2, var3, $var4

または、私は単にこれを行います。これは、他のもので機能する場合と機能しない場合があります。

s/\$(\w+)\s*/$1, /g
于 2012-08-27T23:17:41.493 に答える
0

変数が次の行の最後にあるかどうかを条件として置換を行います。

$string =~ s{\$([a-z]+[a-z0-9]*)(\s*$)?}{ defined $2 ? $1 : "$1," }ge;

対応するサブパターン$2はです(\s*$)?。は?一致をオプションにするため$2、そのパターンが正常に一致した場合、つまり、行の最後の変数に対してのみ定義されます。これは、末尾に空白が表示されていない場合でも同様です。「内部」変数の場合は、末尾にコンマを追加します。それ以外の場合は、変数名のみが機能します。

例えば

#! /usr/bin/env perl

use strict;
use warnings;

while (defined(my $string = <DATA>)) {
  $string =~ s{\$([a-z]+[a-z0-9]*)(\s*$)?}{ defined $2 ? $1 : "$1," }ge;
  $string =~ s/\becho\b/print/g;  # for demo only
  print $string, "\n";
}

__DATA__
echo $var1 $var2 $var3
echo $var1 $var2 $var3 $var4

出力:

var1、var2、var3を印刷します
var1、var2、var3、var4を印刷します
于 2012-12-06T13:38:51.457 に答える
0

正規表現を次のように変更するだけです。

$string =~ s/\$([a-z][a-z0-9]*)(?:\s*|$)/$1, /gi; 
$string =~ s/,\s*$//; #courtesy Hameed

非捕捉グループは、変数がスペースで終わるか、スペースがまったくないか、または行末にあることを保証します。

$var1 $var2 $var3 $var4$var6これは、および出力のようなエコーにも一致しますvar1, var2, var3, var4, var5, var6

于 2012-08-27T23:43:24.657 に答える
0

(\s+\S+) と一致すると、正規表現エンジンは 2 番目の変数を渡します。先読みアサーションにより、文字列を消費せずに何が先にあるのかを確認できます

 $string =~ s{
   \$ 
   ( [a-z]+[a-z0-9]* )  # capture varname
   (?=\s+\S+)           # lookahead
 } {$1,}gix ;

\s+S+ のマッチングもキャプチャもしていないので、置換文字列に $2 として含める必要はありません。/x を使用すると、正規表現の間隔を空けてコメントを追加できます。

注 - 他の回答は、あなたがやろうとしていることにより近いものになるかもしれません。2 番目の変数が一致しないという特定のクエリを説明しているだけです。

于 2012-08-28T06:48:50.297 に答える