假设我有一个字符串并且正在搜索特定的通配符。例如:
x <- "AJSDKLAFJASFJABJKADL"
z <- stri_locate_all_regex(x, 'A*****AF')
我想搜索A和AF之间任意5个字符的所有字词,例如ABJDKAAF或AJSDKLAF ...但是上面的代码不起作用。我有一个简单的方法可以做到这一点吗?谢谢!
答案 0 :(得分:3)
在正则表达式中(与您可能习惯使用的标准通配符相对),*
表示“前面一个字符的0或更多”,因此“A *”表示“0或更多A”。你不能像'****'那样堆叠它们,因为你想要'。'这意味着“一个角色”。
z <- stri_locate_all_regex(x, 'A.....AF')
TL,DR:正则表达式问题,而不是R问题。
答案 1 :(得分:2)
以简单方式来执行此操作,并且我认为您的意思是要在问题中使用通配符,您可以使用{{1将这些字符转换为正确的正则表达式}}。 “通配符”表达式,也称为“glob”,是一种穷人的正则表达式(glob2rx()
)。对于表达式,您可以指定五个?regex
个字符,因为在glob中,?
表示任何单个字符。
?
如果通配符匹配,则返回逻辑向量。
相比之下,x <- c("ABCDEFAF", "XABCDEFAFX", "abcdeaf", "A55555AF", "A666666AF")
# the (simpler?) "wildcard" way
stringi::stri_detect_regex(x, glob2rx("A?????AF"))
## [1] TRUE FALSE FALSE TRUE FALSE
# the regular expression way (probably WRONG)
stringi::stri_detect_regex(x, "A.{5}AF")
## [1] TRUE TRUE FALSE TRUE FALSE
# the regular expression way (CORRECT)
stringi::stri_detect_regex(x, "^A.{5}AF$")
## [1] TRUE FALSE FALSE TRUE FALSE
返回维度1,2的矩阵列表,其中列是字符串中匹配项的起始和结束字符位置,或者是一对stri_locate_all_regex()
值,如果找不到模式。
请注意,通配符/ glob表达式的一个区别是,要获得NA
+任意五个字符+ A
而没有任何前置或尾随字符,您需要指定正则表达式字符对于字符串的开头和结尾,如上所述。否则,匹配也会获得AF
。对于通配符/ glob,这不是问题,因为表达式的开头和结尾匹配字符串的开头和结尾:
"XABCDEFAFX"