说我们有以下文字
example abc http://www.example.com
我知道如何用某些文本替换example
。但是,当我这样做时,如何告诉程序不要替换URL中的example
?
答案 0 :(得分:1)
@kiddorails提醒我一个known trick来解决一个缺少可变宽度的后视镜,它也可以在Ruby中实现。但是,@ kiddorails使用的正则表达式不会在URL之前替换example
。而且,它不是动态的。
这是一个将替换特定单词的函数(使用\b
强制执行整字模式,但如果需要匹配非字首字符和尾随字符的字符串,则可以删除它们)一个URL,即使它们包含必须在正则表达式中转义的符号:
def removeOutsideOfURL(word, input)
rx = Regexp.new("(?i)\\b" + Regexp.escape(word.reverse) + "(?!\\S+ptth\\b)")
return input.reverse.gsub(rx,"").reverse
end
puts removeOutsideOfURL("example", "example def http://www.example.com with a new example")
def http://www.example.com with a new
对于此具体示例和上下文,您可以使用(?<!http:\/\/www\.)example/
:
puts "example def http://www.example.com".gsub(/(?<!http:\/\/www\.)example/, '')
>> def http://www.example.com
您可以添加更多外观以设置更多条件,例如/(?<!http:\/\/www\.)(?<!http:\/\/)example/
example
之后http://
还要保持(?<!\.)example(?!\.)
。{/ 1}
或者,您也可以检查两端的时间段:
{% url %}
答案 1 :(得分:0)
您可以使用sub
:
"example def http://www.example.com".sub("example","")
结果:
" def http://www.example.com"
答案 2 :(得分:0)
更新:@stribizhev的指针:)
对于这个特殊用例,我将使用上面使用的@stribizhev的负向反向正则表达式。
但是有一个带有负面lookbehind正则表达式的问题 - 它只接受固定长度的正则表达式。
因此,如果网址如:http://example.com或http://www.example.com,则支票可以通过第一种情况或最后一种情况。
我建议采用这种方法 - 反转网址,使用否定前瞻正则表达式,并在字符串中替换“example”的反向。以下是演示:
regex = /elpmaxe(?!\S+ptth)/
str1 = "example http://example.com"
str2 = "example http://www.example.com"
str3 = "foo example http://wwww.someexampleurl.com"
str4 = "example def http://www.example.com with a new example"
[str1, str2, str3, str4].map do |str|
str.reverse.gsub(regex, '').reverse
end
#=>[" http://example.com",
" http://www.example.com",
"foo http://wwww.someexampleurl.com",
" def http://www.example.com with a new "]