负前瞻 - 在字符串
问题描述:
的开头我想要做字符串替换在Ruby中,但只有当某些条件不满足。负前瞻 - 在字符串
与“快板”替换“allegro4”的所有出现时,该行不与#include
声明开始。我尝试过,但我没有取得任何成功。替代根本没有完成。
"#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>"
我已经假定特定字符串“快板”是相匹配的,任何非负整数可以遵循的“快板”,但一个不能有“两个实例以下不同数量的两个实例快板”。如果该数字必须是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>"
什么是你的问题? – sawa