首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“至多”的正则表达式

“至多”的正则表达式
EN

Stack Overflow用户
提问于 2020-03-06 10:48:25
回答 1查看 1.4K关注 0票数 0

我目前正在考虑如何最好地将“至多两个”表示为正则表达式。

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]更聪明的正则表达式吗?我认为可以,但我想知道是否有更短的解决方案。

EN

回答 1

Stack Overflow用户

发布于 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)
  • 在一个词中最多连续重复两个bstr_extract_all("aaa abc abb bbb babnbdb", "\\b(?!\\p{L}*b{3})\\p{L}+\\b") (=> [1] "aaa" "abc" "abb" "babnbdb")
  • 在字符串中最多连续重复2次bstr_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")。

R演示在线

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60562489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档