2017-12-04 8 views
1

ftpまたはftpk(例)から始まるすべての文字列を抽出したいとします。正規表現は数値ではない英字/数字と一致します

私は現在、言う解決策があります。

はすべてftpで始まる文字列ではなく ftpxまたはftpcで始まるそれらを取得します。

私は(今私が面倒になる可能性のある例外をリストアップしていますので)、のようなもの、私はそれがより一般的にすることができますか疑問:

ftpではなく、それらで始まるすべての文字列を取得します。 ftpXで始まり、Xは、kではない任意の英字/数字です。

# Data: 
vec <- c("ftp:ladpmxqgvt", "ftpx:xfiwyoloqu", "ftpk:yol.qdsrehn", 
     "ftpc:krjqdzsuhb", "ftpk:yolo.taxukj", "ftp:qvxarpkjid", 
     "ebutlngqkr", "yolx.vhznja") 

# Current solution (desired output) 
grep("^ftp[^xc]", vec, value = TRUE) 
"ftp:ladpmxqgvt" "ftpk:yol.qdsrehn" "ftpk:yolo.taxukj" "ftp:qvxarpkjid" 
+0

これは: '^ ftpk?:'? – ctwheels

+0

@ctwheelsそれはftpを無視するでしょう – Dason

+0

@Dason再び見てください。 – ctwheels

答えて

1

コード

See regex in use here

^ftpk?: 

:は、あなたは、単にftpまたはftpkを確保し、以下を使用することができますftpに続くかどうかがわからない場合には非が続いています - 文字:

入力

ftp:ladpmxqgvt 
ftpx:xfiwyoloqu 
ftpk:yol.qdsrehn 
ftpc:krjqdzsuhb 
ftpk:yolo.taxukj 
ftp:qvxarpkjid 
ebutlngqkr 
yolx.vhznja 

出力リストの下に

だけ

ftp:ladpmxqgvt 
ftpk:yol.qdsrehn 
ftpk:yolo.taxukj 
ftp:qvxarpkjid 

と一致するの

結果説明

  • ^アサートライン
  • ftpマッチこの文字通り
  • k?マッチの開始時位置k文字通りゼロまたは
  • :マッチたら、これは文字通り
0

私はこれを考えます解は最も近い文を模倣する:

ftpXで始まるすべての文字列を取得します。Xは、k以外のアルファベット/数字です。

grep("ftp(?!k)[[:alnum:]](*SKIP)(*FAIL)|ftp", vec, value = TRUE, perl = TRUE) 

または

grep("ftp(?!(?!k)[[:alnum:]])", vec, value = TRUE, perl = TRUE) 

結果:

[1] "ftp:ladpmxqgvt" "ftpk:yol.qdsrehn" "ftpk:yolo.taxukj" "ftp:qvxarpkjid" 

注:

  • 最初の解決策では、特定のパターンの一致を避けるために(*SKIP)(*FAIL)トリックを使用します。この場合、私はそれを避けるために使用していますftpの後ろに英数字の後にkを除き、回避されなかったftpにマッチします。

  • 第2の解決方法は同様ですが、否定的な先読みを使用します。 kを除くすべての英数字に一致します。ftp(?!(?!k)[[:alnum:]])は、kを除く任意の英数字の直後には、ftpと一致しません。

  • これらの2つのソリューションの利点は、回避すべき事項を追加できることです。 (?!k)[[:alnum:]]または(?!(?!k)[[:alnum:]])に追加するだけです。

関連する問題