Arrays 如何提取全名数组中的姓氏?
假设我在一个bash数组中有一个全名,我想稳健地提取姓氏和非姓氏(如果存在的话,还有名字和中间名)。例如,我展示了以下三个例子来说明这个问题的复杂性Arrays 如何提取全名数组中的姓氏?,arrays,regex,bash,Arrays,Regex,Bash,假设我在一个bash数组中有一个全名,我想稳健地提取姓氏和非姓氏(如果存在的话,还有名字和中间名)。例如,我展示了以下三个例子来说明这个问题的复杂性 x1=(John von Neumann) x2=(Michael Jeffrey Jordan) x3=(Michael Jordan) 有没有人有提取姓氏和非姓氏的好方法?谢谢。我假设你把每个名字都放在一个单独的数组中。更灵活的方法是使用正则表达式。用通俗易懂的英语,regex说: -姓氏以小写字符开头,后跟许多字母字符和空格 -或者姓氏跟在
x1=(John von Neumann)
x2=(Michael Jeffrey Jordan)
x3=(Michael Jordan)
有没有人有提取姓氏和非姓氏的好方法?谢谢。我假设你把每个名字都放在一个单独的数组中。更灵活的方法是使用正则表达式。用通俗易懂的英语,regex说: -姓氏以小写字符开头,后跟许多字母字符和空格 -或者姓氏跟在字符串的最后一个空格后面 看看这个:
#!/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
姓氏
+
非姓氏=全名?这意味着您要提取全名?在全局匹配中尝试:\([^)]*)
“健壮”是您无法获得的。想想所有时候的最爱。这就是我刚才提到并建议您不要尝试解析姓名的问题——如果可能和必要,请在数据输入过程中获取姓氏。虽然可以解析特定区域性的大多数名称,但您总是会有一定百分比的错误。@Cyrus抱歉,已修复。这看起来不错。非姓氏部分呢?姓氏和非姓氏都可以在同一个正则表达式中表示,这样就可以使用BASH_-REMATCH[1]和BASH_-REMATCH[2]来提取两者吗?表达式${name:0:${{name}-${{BASH#u-REMATCH}将给出第一部分,甚至不改变正则表达式。那么“James Van Ness”呢?