perlregex,用于将单个和多个单词处理并保存到一个变量中



我正在编写一个perl脚本来读取成员的全名,并将其保存到变量firstname和lastname中,如下所示:

my ($firstname, $lastname) = $member =~ m/^(w+.*?) +(w+)$/;
my $member_name = $firstname.' '.$lastname;

$member的值来自上游服务,例如"Jane Doe"现在,当服务发送$member值(如"Jane")时,上面的代码无法处理。正则表达式无法处理该代码行中的单个单词。我需要它来处理多个单词和单个单词。我无法实现新的代码功能,所以我希望添加到现有的regex中,这样就可以将更改最小化,并且它可以处理这两种情况。

到目前为止,这是我在命令行中测试的内容,但到目前为止运气不佳:

perl -e 'my ($firstname, $lastname) = "Jane Doe" =~ m/^(w+.*?) +(w+)$/|m/^(w+)$/; print "$firstnamen$lastname";'

当我用"Jane"代替"Jane Doe"时,没有打印出任何内容。不过,我希望代码采用这种格式。就像如果值是多个单词,它应该同时打印它们,否则只打印一个单词。

我们将非常感谢你的帮助。

Perl代码中存在语法错误。您过早终止了模式。

#    /                 /   /      /   
#                      V
m/^(w+.*?) +(w+)$/|m/^(w+)$/

这将导致CCD_ 1被解释为按位或。由于后面还有另一个m//,所以|将获取两个m//操作的返回值并发挥其魔力。第二个m//将恰好与主题$_相匹配。

您实际想要的是合并这两种模式。

my ($firstname, $lastname) = "Jane Doe" =~ m/^(?:(w+.*?) +)?(w+)$/;

您需要使用非捕获组(?:)使第一个名称可选,然后使用?none或one量词。

您不能像您可能想要的那样有三个捕获组,因为第三个将转到$3,而不是|0。

但是,上面的解决方案使用姓氏,然后将其分配给$firstname变量。您的全名模式允许名字中包含任何字符,如Jean-Luc Picard。但如果你只传给让-吕克,比赛就会失败。因此,如果你只想要名字,你应该使用正确的模式使其一致。

一个简单的方法是将姓氏改为可选。

my ($firstname, $lastname) = "Jane" =~ m/^(w+.*?)(?: +(w+))?$/;

请记住,这会将$lastname设置为undef,这在命令行示例中并不重要,但在具有strictwarnings的适当程序中(您当然已经打开了,对吧?),如果$lastname用作字符串,而它是undef,它会抱怨。


我建议你阅读这篇关于名字的文章。

最新更新