如何提取符号和space之间的字符串?

How to extract a string between a symbol and a space?

我正在尝试提取文本聊天中标记的用户名,例如“@Jack @Marie 你好!”

我正在尝试结合 @ 和空格来执行此操作,但我无法让正则表达式匹配非贪婪(或者至少我认为这是错误的):

library(stringr)
str_extract(string = '@This is what I want to extract', pattern = "(?<=@)(.*)(?=\s+)")

[1] "This is what I want to"

我想提取的只是 This

你可以让你的正则表达式不贪婪:

(?<=@)(.*?)(?=\s+)

或者,如果您只想在 @ 符号后捕获 "This",您可以只使用正后视来尝试这样:

(?<=@)\w+

说明

  • 积极的回顾(?<=
  • 断言后面是一个@
  • 关闭正面回顾)
  • 匹配一个或多个单词字符\w+

这是一种非正则表达式方法,或者更确切地说是最小正则表达式方法,因为 grep 通过正则表达式引擎检测 @

grep('@', strsplit(x, ' ')[[1]], value = TRUE)
#[1] "@This"

或者为了避免strsplit,我们可以使用scan(取自this answer),即

grep('@', scan(textConnection(x), " "), value=TRUE)
#Read 7 items
#[1] "@This"

正则表达式 ((.*)) 的中心部分是任意字符的序列。

相反,您应该查找除白色以外的一系列字符 space (\S+) 或 字字符 (\w+).

另请注意,我将 * 更改为 +,因为您可能不感兴趣 在任何空的字符序列中。

同时捕获在源中具有 "last" 位置的名称 字符串,你的正则表达式的最后部分不仅应该匹配一个序列 白色space个字符,也是字符串的结尾,所以改变 (?=\s+)(?=\s+|$).

最后一句话:实际上你不需要括号 "central" 部分。

所以综上所述,整个正则表达式可以是这样的:

(?<=@)\w+(?=\s+|$)

(使用 全局 选项)。