我想让$ var的输出成为John D
my $var = "John Doe";
我试过了
$var =~ s/(.+\b.).+\z],'\1.'//g;
答案 0 :(得分:2)
这是一个通用的解决方案(随意交换'\ w',我使用'。',并添加\ s,我使用\ s +)
my $var = "John Doe";
(my $fname, my $linitial) = $var =~ /(.*)\s+(.).*/
然后你有值
$fname = 'John';
$linitial = 'D';
你可以这样做:
print "$fname $linitial";
获取
"John D"
EDIT 在你进行下一场比赛之前,每个捕获括号都会创建一个变量(分别为$ 1和$ 2),所以整个过程可以缩短一点,如下所示:
my $var = "John Doe";
$var =~ /(.*)\s+(.).*/
print "$1 $2";
答案 1 :(得分:1)
要用最初的字符替换最后一个非空白字符序列,你可以写这个
use strict;
use warnings;
my $var = "John Doe";
$var =~ s/(\S)\S*\s*$/$1/;
print $var;
<强>输出强>
John D
答案 2 :(得分:0)
假设您的字符串具有ascii名称,这将起作用
$var =~ s/([a-zA-Z]+)\s([a-zA-Z]+)/$1." ".substr($2,0,1)/ge;
答案 3 :(得分:0)
$var = "John Doe";
s/^(\w+)\s+(\w)/$1 \u$2/ for $var;
答案 4 :(得分:0)
解决此问题的简单正则表达式是替换
s/^\w+\s+\K(\w).*/\U$1/s
这是做什么的?
^ \w+ \s+
匹配字符串开头的单词,加上指向下一个单词的空格\K
是 keep 转义。它将当前匹配的部分保留在该子字符串之外,该子字符串被正则表达式引擎视为“匹配”。这避免了额外的捕获组,实际上是一个后视。(\w)
匹配并捕获一个“单词”字符。这是字符串中第二个单词的主要字符。 .*
匹配字符串的其余部分。我这样做是为了覆盖可能出现的任何其他名称:您声明Lester del Ray
应该转换为Lester D
,而不是Lester D Ray
作为\w*
的解决方案,而不是.*
1}}部分会完成。 /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
答案 5 :(得分:-1)
从长远来看,像这样的东西可能会更有用/可重复使用。
$initial = sub { return substr shift, 0, 1 ; };
制作初始函数
$var =~ s/(\w)\s+(\w)/&$initial($1) &$initial($2)/sge;
然后使用正则表达式中的execute替换第一个和第二个结果;