2017-06-22 13 views
1

私はパターンがのようにここに表示されたいR.における正規表現のパターンを作成しようとしています、私はパターン線にエラーを取得していますがRの正規表現マッチ

file1 <- "example.txt" 
file2 <- "example.ffe.2f2.csv" 
files <- c(file1,file2) 

#pattern that matches everything up to, but not including last . 

pattern <- ".*(?=\.)" 
m <- regexpr(pattern, files) 

Error: '\.' is an unrecognized escape in character string starting "".*(?=\." 

言って、私は正規表現がfile2file1exampleexample.ffe.2f2をマッチさせたいです。私が間違ってやっていることは何ですか? regex101.comで正しく動作するので、パターンが正しいことがわかります。

+1

\\スラッシュはありません。 –

+0

"\"はRのエスケープ文字です。リテラルのバックスラッシュには "\\"を使用する必要があります。 –

+2

さらに、 'regexpr(pattern、files、perl = TRUE)'を使用してください。 –

答えて

3

(?=\.)は、陽性lookaheadである。 TRE正規表現フレーバー(perl=TRUEが指定されていない場合はデフォルトで使用されます)は先読みをサポートしません。このようなパターンを処理するには、PCRE正規表現エンジンを使用する必要があります。

.を適切にエスケープするには、\という文字を使用して、\のシンボルをR文字列で2倍にする必要があります。ただし、.をブラケット式/文字クラス-に入れることで回避できます。

次のコードを使用することがあります。

file1 <- "example.txt" 
file2 <- "example.ffe.2f2.csv" 
files <- c(file1,file2) 
regmatches(files, regexpr(".*(?=[.])", files, perl=TRUE)) 
## => [1] "example"   "example.ffe.2f2" 

online R demoを参照してください。同じ結果が拡張子なしのファイル名を取得します

tools::file_path_sans_ext(files) 

demo)で得ることができる

注意。