负前瞻 - 在字符串

问题描述:

的开头我想要做字符串替换在Ruby中,但只有当某些条件满足。负前瞻 - 在字符串

与“快板”替换“allegro4”的所有出现时,该行不与#include声明开始。我尝试过,但我没有取得任何成功。替代根本没有完成。

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

望着负向前看符号的其他例子,试图irb不同的事情使我相信,有一个专门的字符串的开头负向前看符号事情很奇怪。

+0

什么是你的问题? – sawa

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>" 

我已经假定特定字符串“快板”是相匹配的,任何非负整数可以遵循的“快板”,但一个不能有“两个实例以下不同数量的两个实例快板”。如果该数字必须是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>"