【问题标题】:How to extract the last name in an array of a full name?如何提取全名数组中的姓氏?
【发布时间】:2015-08-29 03:05:06
【问题描述】:

假设我在 bash 数组中有一个全名,我想稳健地提取姓氏和非姓氏(如果存在,则为名字和中间名)。例如,我用下面三个例子来说明这个问题的复杂性。

x1=(John von Neumann)
x2=(Michael Jeffrey Jordan)
x3=(Michael Jordan)

有人有提取姓氏和非姓氏的好方法吗?谢谢。

【问题讨论】:

  • 姓氏+非姓氏=全名?这意味着您要提取全名?
  • 尝试:\(([^)]*) 进行全局匹配
  • “健壮”是你不会得到的。考虑一下一直以来最喜欢的Charles-Jean Étienne Gustave Nicolas de la Vallée-Poussin。 :)
  • 这是我刚刚提到Falsehoods Programmers Believe About Names 的问题,并建议您不要尝试解析名称——如果可能和必要,请在数据输入期间获取姓氏。虽然可以解析特定文化的大多数名称,但总会有一定比例的错误。
  • @Cyrus 抱歉,已修复。

标签: arrays regex bash


【解决方案1】:

我假设您将每个名称放在一个单独的数组中。更灵活的方法是使用正则表达式。正则表达式用简单的英语说: - 姓氏以小写字符开头,后跟多个字母字符和空格 - 或者姓氏跟在字符串的最后一个空格之后。

看看这个:

#!/bin/bash

x1=(John von Neumann)
x2=(Michael Jeffrey Jordan)
x3=(Michael Jordan)
x4=(Charles-Jean Etienne Gustave Nicholas de la Vallée-Poussin)

regex="[[:space:]]([a-z]+.*|[A-Z][^[:space:]]+)$"

for i in 1 2 3 4
do
  eval name=\${"x"$i[@]}
  if [[ $name =~ $regex ]]; then
    fullname=${BASH_REMATCH[1]}
    echo $fullname
  fi
done

【讨论】:

  • 这看起来不错。非姓氏部分呢?姓氏和非姓氏可以在同一个正则表达式中表示,以便可以使用 BASH_REMATCH[1] 和 BASH_REMATCH[2] 来提取两者吗?
  • 表达式 ${name:0:${#name}-${#BASH_REMATCH}} 将为您提供第一部分,甚至无需更改正则表达式。
  • “詹姆斯·范内斯”怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2015-04-30
相关资源
最近更新 更多