正则表达式匹配不是x的字母/数字

时间:2017-12-04 15:37:20

标签: r regex

假设我想从ftpftpk开始提取所有字符串(示例组成)。

我目前有一个解决方案说:

  

获取以ftp开头的所有字符串,但不包括那些以字符串开头的字符串   ftpxftpc

我想知道如何让它更通用(因为现在我列出了可能变得单调乏味的例外情况),例如:

  

获取以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" 

2 个答案:

答案 0 :(得分:1)

代码

See regex in use here

^ftpk?:

如果您不知道:是否会跟随ftp,您可以使用以下内容,这样可以确保ftpftpk后跟非^ftpk?\b 字符:

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匹配:字面上为零或一次
  • <OverlayTrigger rootClose={true}...按字面意思匹配

答案 1 :(得分:0)

我认为这个解决方案最接近于模仿句子:

  

获取以ftp开头的所有字符串,但不是以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

  • 第二种解决方案类似,但使用否定前瞻。 (?!k)[[:alnum:]]匹配除k以外的所有字母数字,而ftp(?!(?!k)[[:alnum:]])匹配ftp后不会紧跟任何字母数字,但k除外。

  • 这两种解决方案的优点是可以添加要避免的东西。只需将其添加到(?!k)[[:alnum:]](?!(?!k)[[:alnum:]])