Rの文字列処理： ある文字列で挟まれた部分を取り出したい


Rを使った文字列処理に関する質問です．

例えば

[code]

    "XhogehogeY"
    
[/code]

という文字列があったときに，  
XとYを指定して"hogehoge"を取り出すにはどうしたら良いでしょうか？

教えて下さいお願いします．

追記-----------------------------------------------------------------------------------------  
様々な回答ありがとうございます．  
一旦は解決したのですが，文字列に日本語を含む場合にエラーが出たので改めて質問させてください．

文字列

[code]

    "pogepoge開始:hogehoge終pogepoge終"
    
[/code]

から"hogehoge"を取り出したいです．  
しかし，

[code]

    > str_extract("pogepoge開始:hogehoge終pogepoge終","(?<=開始:)(.*?)(?=終)")
    [1] NA
    
[/code]

として切り出そうとするとNAとなるのです．

[code]

    > str_detect("pogepoge開始:hogehoge終pogepoge終","(?<=開始:)(.*?)(?=終)")
    [1] TRUE
    
[/code]

となっているので確かにマッチしているはずですが．．．

以下のように"始:"としたら切り出せました．

[code]

    > str_extract("pogepoge開始:hogehoge終pogepoge終","(?<=始:)(.*?)(?=終)")
    [1] "hogehoge"
    
[/code]

しかし"始:"では他の文字列とマッチしてしまうので，"開始:"で切り出したいのです．




`str_detect()` と `str_extract()` をソースコード上で調べてみました。

# stringr 1.0.0 は
[stringi](https://cran.r-project.org/web/packages/stringi/index.html) の
wrapper です。

**str_detect():stringi/src/stri_search_regex_detect.cpp**

[code]

    StriContainerUTF16 str_cont(str, vectorize_length);
    //   StriContainerUTF8 str_cont(str, vectorize_length); // utext_openUTF8, see below
    StriContainerRegexPattern pattern_cont(pattern, vectorize_length, pattern_flags);
    
[/code]

**str_extract():stringi/src/stri_search_regex_extract.cpp**

[code]

    StriContainerUTF8 str_cont(str, vectorize_length);
    StriContainerRegexPattern pattern_cont(pattern, vectorize_length, pattern_flags);
    
[/code]

`str_detect()` では処理対象の文字列を格納する変数 `str_cont` の型が `StriContainerUTF8` から
`StriContainerUTF16` に変更されているのですが、`str_extract()` ではそのままです。

近い将来、`str_extract()` も `StriContainerUTF16` に変更されるかも知れません(pull request
を出す方が良いのかも知れませんが…)。

stringr を使わない方法でも良いのであれば、前の回答に書いておいた方法を使ってみてはいかがでしょうか。

[code]

    > unlist(strsplit("pogepoge開始:hogehoge終pogepoge終", "開始:|終"))[2]
    [1] "hogehoge"
    
[/code]




同じ
`{stringr}`パッケージの`str_replace()`関数を使った抽出パターンをかんがえてみました。今回の場合、文字列のはじめにX、最後にYということでしたので、それらを空白で置換するという方法です。

[code]

    library(stringr)
    str_replace_all("XhogehogeY", "^X|Y$", "")
    # [1] "hogehoge"
    
[/code]

コメントのパターンに関しては、つぎのようにすることで対象の文字列を抽出出来ました。

[code]

    str_replace_all("STARThogehogeENDpogepogeEND", "^START|END.*", "")
    # 文字列の始めのSTART、最初のEND以降を空白で置換
    # [1] "hogehoge"
    
[/code]

外部パッケージを利用しないパターンは、`gsub()`を使って同様につぎのようにします。

[code]

    gsub("^X|Y$", "", "XhogeY")
    gsub("^START|END.*", "", "STARThogehogeENDpogepogeEND")
    
[/code]

