Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何提取全名数组中的姓氏?_Arrays_Regex_Bash - Fatal编程技术网

Arrays 如何提取全名数组中的姓氏?

Arrays 如何提取全名数组中的姓氏?,arrays,regex,bash,Arrays,Regex,Bash,假设我在一个bash数组中有一个全名,我想稳健地提取姓氏和非姓氏(如果存在的话,还有名字和中间名)。例如,我展示了以下三个例子来说明这个问题的复杂性 x1=(John von Neumann) x2=(Michael Jeffrey Jordan) x3=(Michael Jordan) 有没有人有提取姓氏和非姓氏的好方法?谢谢。我假设你把每个名字都放在一个单独的数组中。更灵活的方法是使用正则表达式。用通俗易懂的英语,regex说: -姓氏以小写字符开头,后跟许多字母字符和空格 -或者姓氏跟在

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

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”呢?