Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby仅用另一个字符串替换完全匹配的字符串_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Ruby仅用另一个字符串替换完全匹配的字符串

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

如何解决以下问题

我有一个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 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>"