负向前看——在字符串的开头



我想在Ruby中做字符串替换,但只有在特定条件不满足时。

当行不是以#include语句开头时,将所有出现的'allegro4'替换为'allegro'。我试过了,但我没有任何成功。这个替换根本没有完成。

"#include <allegro4/allegro4.h>".gsub(/(?!#include) allegro4/, 'allegro')

irb中查看其他负序查找的例子并尝试不同的东西使我相信负序查找有一些奇怪的事情发生,特别是在字符串的开头

R = /
    A              # match beginning of string
    (?!#include)   # do not match '#include' at start of string (negative lookahead)
    .*?             # match any number of any character
    <               # match '<'
    K              # forget everything matched so far
    allegro         # match string
    (d+)           # match one or more digits in capture group 1
    /allegro       # match string
    1              # match the contents of capture group 1
    /x              # Free-spacing regex definition mode
def replace_unless(str)
  str.gsub(R, 'allegro/allegro') 
end
replace_unless "cat #include <allegro4/allegro4.h>"
  #=> "cat #include <allegro/allegro.h>" 
replace_unless "cat #include <allegro4/allegro3.h>"
  #=> "cat #include <allegro4/allegro3.h>"
replace_unless "#include <allegro4/allegro4.h>"
  #=> "#include <allegro4/allegro4.h>" 

我已经假设要匹配特定的字符串'allegro',并且任何非负整数都可以跟随'allegro'的两个实例,但不能在'allegro'的两个实例后面有不同的数字。如果必须为4,则将正则表达式中的(d+)1都替换为4。如果'allegro'只是任何小写字母字符串的替代,则可以按如下方式更改正则表达式。

R = /
    A              # match beginning of string
    (?!#include)   # do not match '#include' at start of string (negative lookahead)
    .*              # match any number of any character
    <               # match character
    K              # forget everything matched so far
    ([[:lower:]]+)  # match one or more lower-case letters in capture group 1
    (d+)           # match one or more digits in capture group 2
    /              # match character
    1              # match the contents of capture group 1
    2              # match the contents of capture group 2
    /x              # Free-spacing regex definition mode
def replace_unless(str)
  str.gsub(R, '1/1') 
end
replace_unless "cat #include <cats9/cats9.h>"
  #=> "cat #include <cats/cats.h>" 
replace_unless "dog #include <dogs4/dogs3.h>"
  #=> "dog #include <dogs4/dogs3.h>" 
replace_unless "#include <pigs4/pigs4.h>"
  #=> "#include <pigs4/pigs4.h>" 

最新更新