例如,假设我有以下字符串
vec <- " @_Jim98 Did you turn off the stove @9am?"
我想计算字符串中仅包含数字,字母,@和下划线符号的@字符数。在上面的情况下,自上午9点起它只会算1?包含?符号,所以不计算在内。
此外,它不能超过10个字符。
答案 0 :(得分:3)
1)搜索@后跟任意数量的允许字符"\\w"
,后跟空格字符"\\s"
或|
字符串结尾{{1 }}。如果允许零字符,则将+更改为*。表达式是矢量化的,即$
可以是字符向量。没有包使用。
x
请注意x <- " @_Jim98 Did you turn off the stove @9am?" # test input
pat <- "@\\w+(\\s|$)"
lengths(regmatches(x, gregexpr(pat, x)))
## [1] 1
的原因是regmatches
为没有匹配产生-1而不是零长度向量,而gregexpr
将产生零长度向量。因此,它适用于没有匹配的边缘情况。
2)稍微更紧凑的解决方案是regmatches
来自上方:
pat
答案 1 :(得分:2)
我们可以使用正则表达式执行此操作。我正在解释你是在计算由空格字符分隔的单词还是在字符串的开头或结尾处出现的单词。这假设@
位于单词的开头,我匹配@
后跟一些单词字符\\w
(字母和数字)或下划线。您可以删除第一个(^|\\s)
,如果您不关心在单词的开头@
,并且想要计算3个单词,例如" @_Jim98 Did the Latin@s or tom@domain turn off the stove @9am?"
stringr::str_count(" @_Jim98 Did you turn off the stove @9am?", "(^|\\s)@(\\w|_)*?($|\\s)")
#> [1] 1
由reprex package(v0.2.0)创建于2018-04-12。