Ruby 可变长度后视

Ruby 可变长度后视,ruby,regex,Ruby,Regex,好的,这是我的正则表达式来匹配鱼和青蛙,除非鱼或青蛙前面有猫 /(?<!cat\s)f(ish|rog)/ 正如您所看到的,除非cat和frog/fish之间有零个或多个空格字符,否则正则表达式可以完美地工作。因此,从逻辑上讲,将零个或多个空格字符添加到我的“反向查找”中应该可以解决以下问题: /(?<!cat\s*)f(ish|rog)/ /(? 不幸的是,可变长度的look behind无效 如何将上述内容转换为有效的正则表达式,或者是否存在允许我使用可变长度look beh

好的,这是我的正则表达式来匹配鱼和青蛙,除非鱼或青蛙前面有猫

/(?<!cat\s)f(ish|rog)/
正如您所看到的,除非cat和frog/fish之间有零个或多个空格字符,否则正则表达式可以完美地工作。因此,从逻辑上讲,将零个或多个空格字符添加到我的“反向查找”中应该可以解决以下问题:

/(?<!cat\s*)f(ish|rog)/
/(?
不幸的是,可变长度的look behind无效

如何将上述内容转换为有效的正则表达式,或者是否存在允许我使用可变长度look behinds的gem

(将frog更新为rog)

失败的尝试:

  • (第一次尝试)

  • (没有)

  • (没有)

  • 这一个非常接近,不幸的是,它还匹配每个鱼/青蛙后面前面的空格)


您可以使用交替运算符

cat\s*f(?:ish|rog)|(f(?:ish|rog))


这里还有一些方法

首先,对于测试:

def test
  result =
  [
    ['foo catfish',       false], 
    ['fooxcat fish',      false],
    ['foo cat frog',      false],
    ['foo cat    fish',   false],
    ['foo cat    frog',   false],
    ['foo dog fish frog', true ],
    ['fooxfish',          true ],
    ['foo frog cat',      true ],
  ].find { |str, res| check_it(str) != res }
  result ? (puts result; false) : true
end
#1最简单的正则表达式

def check_it(str)
  word = str[/cat|fish|frog/] 
  word && word != 'cat'
end

test #=> true
“猫”
必须是第一个

#2分而治之

def check_it(str)
  off = (str =~ /cat/)
  off = str.size unless off 
  !!(str[0, off] =~ /fish|frog/)
end

test #=> true

f(ish | frog)
应该是
f(ish | rog)
怎么样
str!=/\bcat\b/&str[/\b(:?fish | frog)\b/]
。这样可以简化并检查字符串中的任何地方是否有“cat”(这是你在第一句话中说的你想做的)。@CarySwoveland抱歉,前面是我试过的catHere:
(?@Jonny5谢谢,将来我会用
gsub!
匹配并去掉空格,但是做得很好!或者
cat\s*f(?:ish rog)\K|f(?:ish rog)
这不是有点重复吗?或者DRY principal与regex有点不同,因为重复可以使匹配更有效还是什么?请投票给\K……。Jay,关于@Avinash,你应该知道一些事情。他是regex专业人士。无论何时发布Ruby regex问题,他都会在几秒钟内出现。然后他消失,等待回答我不知道他是怎么做到的。@CarySwoveland哈哈哈okay@CarySwoveland我喜欢写答案,因为像你这样的人激励着回答者。
def check_it(str)
  word = str[/cat|fish|frog/] 
  word && word != 'cat'
end

test #=> true
def check_it(str)
  off = (str =~ /cat/)
  off = str.size unless off 
  !!(str[0, off] =~ /fish|frog/)
end

test #=> true