以下の $var の出力を John D にしたい
my $var = "John Doe";
私が試してみました
$var =~ s/(.+\b.).+\z],'\1.'//g;
これが一般的な解決策です(「.」を使用した場所に「\ w」を自由に交換し、\ s +を使用した場所に\ sを追加してください)
my $var = "John Doe";
(my $fname, my $linitial) = $var =~ /(.*)\s+(.).*/
次に、値を取得します
$fname = 'John';
$linitial = 'D';
そして、次のことができます:
print "$fname $linitial";
取得するため
"John D"
編集次の一致を行うまで、各キャプチャ括弧は変数 (それぞれ $1 と $2) を作成するため、次のように全体を少し短縮できます。
my $var = "John Doe";
$var =~ /(.*)\s+(.).*/
print "$1 $2";
この問題を解決する単純な正規表現は、次の置換です。
s/^\w+\s+\K(\w).*/\U$1/s
これは何をしますか?
^ \w+ \s+
文字列の先頭にある単語と、次の単語に向かって空白を加えたものに一致します\K
キープエスケープです。現在一致している部分は、正規表現エンジンによって「一致した」と見なされる部分文字列の外側に保持されます。これにより、余分なキャプチャ グループが回避され、実際には後読みになります。(\w)
1 つの「単語」文字に一致してキャプチャします。これは、文字列の 2 番目の単語の先頭文字です。.*
文字列の残りの部分に一致します。私は来るかもしれない他の名前を上書きするためにこれを行います: あなたはLester del Ray
に変換する必要があるとLester D
述べLester D Ray
まし\w*
た.*
。/s
修飾子は、改行を含むすべての文字に一致させることができるため、これに関連しています(.
文字列の内容を誰が知っていますか?)。\U
修飾子を使用して、キャプチャの値で構成される残りの文字列を大文字にします。テスト:
$ perl -E'$_ = shift; s/^\w+\s+\K(\w).*/\U$1/s; say' "Lester del Ray"
Lester D
$ perl -E'$_ = shift; s/^\w+\s+\K(\w).*/\U$1/s; say' "John Doe"
John D
文字列にASCII名があると仮定すると、これは機能します
$var =~ s/([a-zA-Z]+)\s([a-zA-Z]+)/$1." ".substr($2,0,1)/ge;
$var = "John Doe";
s/^(\w+)\s+(\w)/$1 \u$2/ for $var;
このようなものは、長期的にはもう少し使いやすく、再利用しやすいかもしれません。
$initial = sub { return substr shift, 0, 1 ; };
get初期関数を作る
$var =~ s/(\w)\s+(\w)/&$initial($1) &$initial($2)/sge;
次に、正規表現で execute を使用して最初と 2 番目の結果を置き換えます。