我目前正在考虑如何最好地将“至多两个”表示为正则表达式。
str_detect("xxx", "x{0,2}")给了TRUE,我明白了原因。例如,由于前两个x。我想要一个给出FALSE的正则表达式。str_detect("xxx", "x{0,2}[^x]")实现了这一点,这很好。str_detect("xxx", "x{0,2}(?!x)")通向TRUE,我对此感到非常惊讶。为什么是这种情况?
您能想到另一个比x{0,2}[^x]更聪明的正则表达式吗?我认为可以,但我想知道是否有更短的解决方案。
发布于 2020-03-06 12:59:57
你应该精确地定义“至多”的意思。您正在使用表达式来表示0、1或2次事件,并且用{0,2} 限位量词表示。
然而,单个字符的重复可以立即发生,或在两者之间的一定距离内发生。也就是说,重复可以是连续的和非连续的.在前一种情况下,我们在正上下文中使用x{0,2},在消极上下文中使用x{3},在后一种情况下,我们必须使用量化的否定字符类来排除字符,比如(?:[^x]*x){0,2} (正上下文)/ (?:[^x]*x){3} (负面上下文)。
什么是正负上下文?当你说“最多2”时,它等于“不超过3”。因此,如果出现N+1匹配,则匹配将失败。在大多数情况下,积极的语境和有规律的消费语境相结合,消极的语境通常被设定在消极的情境中。
“至多”示例
b字符:str_detect(c("aaa","abc","abb","bbb","babnbdb"), "^(?!.*b{3})") (=> [1] TRUE TRUE TRUE FALSE TRUE)b:str_extract_all("aaa abc abb bbb babnbdb", "\\b(?!\\p{L}*b{3})\\p{L}+\\b") (=> [1] "aaa" "abc" "abb" "babnbdb")b:str_detect(c("aaa","abc","abb","bbb","babnbdb"), "^(?:[^b]*b){0,2}[^b]*$") (=> [1] TRUE TRUE TRUE FALSE FALSE)b字母:str_extract_all("aaa abc abb bbb babnbdb", "\\b(?!(?:[\\p{L}--[b]]*b){3})\\p{L}+\\b") (=> [1] "aaa" "abc" "abb")。https://stackoverflow.com/questions/60562489
复制相似问题