單一和全域性匹配

使用正規表示式時,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 引數來啟用它們。