Perl正则表达式将名字姓氏替换为姓名last last

时间:2013-06-13 14:44:44

标签: perl

我想让$ var的输出成为John D

my $var = "John Doe";

我试过了 $var =~ s/(.+\b.).+\z],'\1.'//g;

6 个答案:

答案 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替换第一个和第二个结果;