提取以某个符号结尾但没有此符号的子字符串

时间:2014-12-10 21:01:51

标签: regex r string

我有一些字符串

string <- "Shakira - Wolf - 02.Hips don't lie.mp3"

我只想要第一部分,所以艺术家的名字。我像这样使用正则表达式

stri_extract_all_regex(string, "^.*?-")

输出:"Shakira -"。但我不想" -"。如何编写正则表达式,允许我只占用第一个" -" 之前的子字符串?

4 个答案:

答案 0 :(得分:5)

我认为你只需要(不使用外部包)

sub(" -.*", "", string)
## [1] "Shakira"

<强>解释

这简单地匹配" -"及其之后的所有内容,直到字符串结尾并将其替换为空。这基本上让你在第一个" -"

之前完成所有事情

如果您坚持使用stringi包(速度),可以使用stri_extract_first

的简单正则表达式
stri_extract_first(string, regex = "[A-Za-z]+")
## [1] "Shakira"

答案 1 :(得分:4)

否定的字符类方法成功:

> stri_extract_all_regex(string, "^[^-]+")
[[1]]
[1] "Shakira "

其他大卫的挑战我现在尝试仅选择字母字符之间的空格,但也使用该功能,因此使用&#34;肯定&#34;选择策略:

string <- "Shakira and Friends - Wolf - 02.Hips don't lie.mp3"
stri_extract_all_regex(string, "^[[:alpha:]]+( *[[:alpha:]])*")
[[1]]
[1] "Shakira and Friends"

答案 2 :(得分:2)

如何使用strsplit

strsplit(string, split = " -")[[1]][1]

答案 3 :(得分:0)

使用rex可能会使这类任务变得更简单。

string <- "Shakira - Wolf - 02.Hips don't lie.mp3"

library(rex)
re_matches(string,
  rex(capture(zero_or_more(any, type='lazy')), spaces, "-"))$'1'

#> [1] "Shakira"