假设我想从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 :(得分:1)
^ftpk?:
如果您不知道:
是否会跟随ftp
,您可以使用以下内容,这样可以确保ftp
或ftpk
后跟非^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:]])
。