單一和全域性匹配
使用正規表示式時,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
引數來啟用它們。