使用 grep 在字符向量中查找字符串

# General syntax:   
# grep(<pattern>, <character vector>)

mystring <- c('The number 5',
              'The number 8',
              '1 is the loneliest number',
              'Company, 3 is',
              'Git SSH tag is git@github.com',
              'My personal site is www.personal.org',
              'path/to/my/file')

grep('5', mystring)
# [1] 1
grep('@', mystring)
# [1] 5
grep('number', mystring)
# [1] 1 2 3

x|y 意味着寻找 xy

grep('5|8', mystring)
# [1] 1 2
grep('com|org', mystring)
# [1] 5 6

. 是 Regex 中的一个特殊字符。这意味着匹配任何角色

grep('The number .', mystring)
# [1] 1 2

尝试匹配点时要小心!

tricky <- c('www.personal.org', 'My friend is a cyborg')
grep('.org', tricky)
# [1] 1 2

要匹配文字字符,你必须使用反斜杠(\)转义字符串。但是,R 在创建字符串时会尝试查找转义字符,因此你实际上需要转义反斜杠本身(即你需要双重转义正则表达式字符。)

grep('\.org', tricky)
# Error: '\.' is an unrecognized escape in character string starting "'\."
grep('\\.org', tricky)
# [1] 1

如果要匹配多个字符中的一个,可以将这些字符包装在括号中([]

grep('[13]', mystring)
# [1] 3 4
grep('[@/]', mystring)
# [1] 5 7

指示字符序列可能是有用的。例如 [0-4] 将匹配 0,1,2,3 或 4,[A-Z] 将匹配任何大写字母,[A-z] 将匹配任何大写或小写字母,[A-z0-9] 将匹配任何字母或数字(即所有字母数字字符)

grep('[0-4]', mystring)
# [1] 3 4
grep('[A-Z]', mystring)
# [1] 1 2 4 5 6

R 还有几个可以在括号中使用的快捷方式类。例如,[:lower:]a-z 的缩写,[:upper:]A-Z 的缩写,[:alpha:]A-z[:digit:]0-9[:alnum:]A-z0-9。请注意,这些整个表达式必须在括号内使用; 例如,要匹配一个数字,你可以使用 [[:digit:]](注意双括号)。另一个例子,[@[:digit:]/] 将匹配字符 @/0-9

grep('[[:digit:]]', mystring)
# [1] 1 2 3 4
grep('[@[:digit:]/]', mystring)
# [1] 1 2 3 4 5 7

括号也可用于否定与克拉(^)的匹配。例如,[^5] 将匹配 5 以外的任何字符。

grep('The number [^5]', mystring)
# [1] 2