单一和全局匹配

使用正则表达式时,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 参数来启用它们。