Ruby on rails Ruby仅用另一个字符串替换完全匹配的字符串
如何解决以下问题 我有一个html字符串,如下所示:Ruby on rails Ruby仅用另一个字符串替换完全匹配的字符串,ruby-on-rails,ruby,Ruby On Rails,Ruby,如何解决以下问题 我有一个html字符串,如下所示: <p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p> 与 “aaa” 替换后的新字符串: <p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p> aaa,b aa aa
<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>
与
“aaa”
替换后的新字符串:
<p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p>
aaa,b aa aaaaa?
下一个可能的文本b bb aa b
所以我想要一个通用的替换程序,它只替换一个精确匹配的字符串。“aaa”只是一个例子。它也可以是“bb”或“两个单词”(=>两个单词,所以text.split在我看来不起作用)
有没有人能想出这样一个动态的查找、匹配和替换方法
我已经试过了,如下所示:
items = ["aaa", "a", "aa", "aa b", "c"]
text = "<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
words = text.split => ["<p>aaa,", "b", "aa", "aaaaa?<br/>Next", "possible", "text", "b", "bb", "aa", "b.</p>"]
new_words = []
words.each do |w|
items.each do |item|
if w == item
w = '<div class="special">#{item}</div>'
end
end
new_words << w
end
text = new_words.join(" ")
items=[“aaa”、“a”、“aa”、“aa b”、“c”]
text=“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”
words=text.split=>[“aaa”,“b”,“aa”,“aaaaa?
下一步”,“可能”,“text”,“b”,“bb”,“aa”,“b.”]
生词=[]
单词。每个单词都有|
项目。每个do |项目|
如果w==项目
w=“#{item}”
终止
终止
示例中的新词“aaa”
具有相同部分的子字符串=>如“aaa”和“aa”
两个单词作为一项=>如示例中的“aa b”
有人给我一个解决问题的主意吗
编辑:有些东西只是我的替代品的占位符。。我的真正替代者也可能是:
%Q( <dfn title="#{strip_tags item.text}">#{item.name}</dfn> )
%Q(#{item.name})
item.text可以是所有内容=>也可以包含“aaa”
item.name例如为“aaa”
因此,多个gsub将替换已经替换的内容。我将使用正则表达式,这是学习和测试表达式的好地方。有关如何使用gsub的更多信息,请查看。这可能不适合此问题的所有用例,因此您可能需要修改它
str.gsub /^<p>a{3}/, "<div class='special'>aaa</div>"
What this says is starting at the beginning of the string (^)
find <p> and 3 assurances of the letter a.
str.gsub/^a{3}/,“aaa”
这是从字符串的开头(^)开始的
找到和字母a的3个保证。
我会使用正则表达式,这是学习和测试表达式的好地方。有关如何使用gsub的更多信息,请查看。这可能不适合此问题的所有用例,因此您可能需要修改它
str.gsub /^<p>a{3}/, "<div class='special'>aaa</div>"
What this says is starting at the beginning of the string (^)
find <p> and 3 assurances of the letter a.
str.gsub/^a{3}/,“aaa”
这是从字符串的开头(^)开始的
找到和字母a的3个保证。
您正在寻找的(不是gsub
)
s=“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”
#=>“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”
match=“aaa”
#=>“aaa”
替换=“aaa”
#=>“aaa”
s、 替补
#=>“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”
“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”==_
#=>正确
您正在寻找的(不是gsub
)
s=“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”
#=>“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”
match=“aaa”
#=>“aaa”
替换=“aaa”
#=>“aaa”
s、 替补
#=>“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”
“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”==_
#=>正确
以下是您想要的替换方法(当然是使用gsub):
def更换器(原稿、图案、更换)
orig.gsub(/#{pattern}(\s |\.\124;,)/,replace+'\1')。到
终止
2.0.0dev:001>def更换器(原版、模式、更换)
2.0.0dev:002?>orig.gsub(/#{pattern}(\s | \.\124;,)/,replace+'\1')。到
2.0.0开发:003?>结束
=>零
2.0.0dev:004>替换(“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.,“aaa”,“aaa”)
=>“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”
以下是您想要的替换方法(当然是使用gsub):
def更换器(原稿、图案、更换)
orig.gsub(/#{pattern}(\s |\.\124;,)/,replace+'\1')。到
终止
2.0.0dev:001>def更换器(原版、模式、更换)
2.0.0dev:002?>orig.gsub(/#{pattern}(\s | \.\124;,)/,replace+'\1')。到
2.0.0开发:003?>结束
=>零
2.0.0dev:004>替换(“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.,“aaa”,“aaa”)
=>“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.”
目前尚不清楚是否有一个或多个aaa
实例,也不清楚您是希望将它们全部替换,还是只替换第一个实例
这将仅取代第一个:
text = "<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
text.sub(/\b(aaa)\b/, %q"<div class='special'>\1</div>")
=> "<p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
正则表达式有\b
(分词)标记,这使得定义单词或子字符串匹配变得容易。您也可以用多个单词替换“aaa”
。不清楚是有一个还是多个aaa
实例,也不清楚您是希望将它们全部替换,还是只替换第一个
这将仅取代第一个:
text = "<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
text.sub(/\b(aaa)\b/, %q"<div class='special'>\1</div>")
=> "<p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
正则表达式有\b
(分词)标记,这使得定义单词或子字符串匹配变得容易。您也可以用多个单词替换“aaa”
。它应该是sub
而不是gsub
,因为OP只想要第一个匹配,并且没有指定它总是在标记旁边。它应该是sub
而不是gsub
,因为OP只需要第一个匹配项,并且没有指定它总是在标记旁边。但是如果字符串是“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.aaa.”,这将不起作用?如果将匹配变量的内容保持不变,它将不起作用。如果您有不同的字符串,则可以通过match=“b bb”
(或您希望匹配的字符串中的任何内容)更改match
变量,或者更好地编辑您的问题,让我们知道字符串是如何更改的,以及您如何知道要获取的部分。但是如果字符串是“aaa,b aa aaaaa?
下一个可能的文本b bb aa b.aaa.”这不起作用?如果保持匹配变量的内容相同,则不起作用。如果您有不同的字符串,则可以通过match=“b bb”
更改匹配变量(或您希望匹配的字符串中的任何内容),或
str.gsub /^<p>a{3}/, "<div class='special'>aaa</div>"
What this says is starting at the beginning of the string (^)
find <p> and 3 assurances of the letter a.
s = "<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
# => "<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
match = "aaa"
# => "aaa"
replacement = "<div class='special'>aaa</div>"
# => "<div class='special'>aaa</div>"
s.sub match, replacement
# => "<p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
"<p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p>" == _
# => true
def replacer(orig,pattern,replace)
orig.gsub(/#{pattern}(\s|\.|,)/,replace+'\1').to_s
end
2.0.0dev :001 > def replacer(orig,pattern,replace)
2.0.0dev :002?> orig.gsub(/#{pattern}(\s|\.|,)/,replace+'\1').to_s
2.0.0dev :003?> end
=> nil
2.0.0dev :004 > replacer("<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>", "aaa", "<div class='special'>aaa</div>")
=> "<p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
text = "<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
text.sub(/\b(aaa)\b/, %q"<div class='special'>\1</div>")
=> "<p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
text = "<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>" * 2
=> "<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p><p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
text.gsub(/\b(aaa)\b/, %q"<div class='special'>\1</div>")
=> "<p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p><p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
target = 'aaa'
text.gsub(/\b(#{ target })\b/, %q"<div class='special'>\1</div>")
=> "<p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p><p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"