首次出现模式后,在另一个模式之前提取字符串

时间:2016-01-21 21:59:12

标签: regex r

我有以下字符串:

strings <- c("David, FC; Haramey, S; Devan, IA", 
            "Colin, Matthew J.; Haramey, S",
            "Colin, Matthew")

如果我想要所有字符串的最后一个名字/名字,我可以使用以下内容:

sub(".*, ", "", strings)
[1] "IA"      "S"       "Matthew"

这会删除最后 ", "

之前的所有内容

但是,我仍然坚持如何获得第一个首字母/给定名称。我知道必须在第一个 ", "之前删除所有内容,但之后我必须删除任何空格后的所有内容,分号,如果有的话。

要清楚我想要的输出是:

c("FC", "Matthew", "Matthew")

任何指针都会很棒。

摆弄我可以获得第一个姓氏gsub( " .*$", "", strings )

1 个答案:

答案 0 :(得分:4)

您可以使用

> gsub( "^[^\\s,]+,\\s+([^;.\\s]+).*", "\\1", strings, perl=T)
[1] "FC"      "Matthew" "Matthew"

请参阅regex demo

说明:

  • ^ - 字符串开头
  • [^\\s,]+ - 除空格或,
  • 以外的1个或多个字符
  • , - 一个文字逗号
  • \\s+ - 一个或多个空格
  • ([^;.\\s]+) - 第1组匹配除;.或空白
  • 以外的1个或多个字符
  • .* - 除换行符以外的任何字符零或以上

如果要使用类似POSIX的表达式,请将字符类(\\s内)中的[...]替换为[:blank:](或[:space:]):

gsub( "^[^[:blank:],]+,\\s+([^;.[:blank:]]+).*", "\\1", strings)