单一和全局匹配
使用正则表达式时,PCRE 的一个修饰符是全局匹配的 g
。
在 R 匹配和替换功能有两个版本:第一个匹配和全局匹配:
-
sub(pattern,replacement,text)
将通过文本替换替换第一次出现的模式 -
gsub(pattern,replacement,text)
将与 sub 相同但每次出现模式 -
regexpr(pattern,text)
将返回第一个模式实例的匹配位置 -
gregexpr(pattern,text)
将返回所有匹配。
一些随机数据:
set.seed(123)
teststring <- paste0(sample(letters,20),collapse="")
# teststring
#[1] "htjuwakqxzpgrsbncvyo"
如果我们想用其他东西替换元音,让我们看看它是如何工作的:
sub("[aeiouy]"," ** HERE WAS A VOWEL** ",teststring)
#[1] "htj ** HERE WAS A VOWEL** wakqxzpgrsbncvyo"
gsub("[aeiouy]"," ** HERE WAS A VOWEL** ",teststring)
#[1] "htj ** HERE WAS A VOWEL** w ** HERE WAS A VOWEL** kqxzpgrsbncv ** HERE WAS A VOWEL** ** HERE WAS A VOWEL** "
现在让我们看看我们如何找到紧跟一个或多个元音的辅音:
regexpr("[^aeiou][aeiou]+",teststring)
#[1] 3
#attr(,"match.length")
#[1] 2
#attr(,"useBytes")
#[1] TRUE
我们在长度为 2 的字符串的位置 3 上匹配,即:ju
现在,如果我们想获得所有匹配:
gregexpr("[^aeiou][aeiou]+",teststring)
#[[1]]
#[1] 3 5 19
#attr(,"match.length")
#[1] 2 2 2
#attr(,"useBytes")
#[1] TRUE
所有这一切都非常棒,但是这只会给出匹配的使用位置,并且不太容易得到匹配的内容,而这里提到了 regmatches
它的唯一目的是提取从 regexpr 匹配的字符串,但它有不同的语法。
让我们将匹配保存在变量中,然后从原始字符串中提取它们:
matches <- gregexpr("[^aeiou][aeiou]+",teststring)
regmatches(teststring,matches)
#[[1]]
#[1] "ju" "wa" "yo"
这可能听起来很奇怪没有快捷方式,但是这允许通过我们的第一个匹配从另一个字符串中提取(想想比较两个长向量,你知道第一个是第一个但不是第二个的常见模式,这允许容易比较):
teststring2 <- "this is another string to match against"
regmatches(teststring2,matches)
#[[1]]
#[1] "is" " i" "ri"
注意注意:默认情况下,模式不是 Perl 兼容的正则表达式,不支持某些类似于 lookarounds 的东西,但此处提供的每个函数都允许使用 perl=TRUE
参数来启用它们。