替换URL中除外的文本

时间:2015-04-26 12:07:41

标签: ruby regex

说我们有以下文字

example abc http://www.example.com

我知道如何用某些文本替换example。但是,当我这样做时,如何告诉程序不要替换URL中的example

3 个答案:

答案 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")

输出sample program

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

Demo on IDEONE

您可以添加更多外观以设置更多条件,例如/(?<!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.comhttp://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 "]