查找使用REGEX找到的字符串中的最后一个字符的索引

时间:2016-12-29 19:05:04

标签: ruby-on-rails ruby regex

我要么找到MatchData对象的长度,要么找到找到的字符串中最后一个元素的索引。所以我可以在它之后插入另一个字符串。

找到的字符串的长度未知,因为此代码将在许多不同的网站上运行。

我拉下一根绳子(它是一个液体模板,需要保持液态,不能转换成HTML,所以Nokogiri不是一个选项)

我正在搜索的字符串是一个表单标记,可以是任意长度,在本例中它看起来像这样:

<form action="/cart" method="post" novalidate class="cart-wrapper">

我也可以找到FIRST元素的索引:

string.index(/\<form.*\>/)

我尝试使用rindex,但返回的值与index

相同

我可以像这样返回表单标记:

found = string.match(/\<form.*\>/)

以上内容返回MatchData个对象,但如果我这样做:

found.size
found.length

它返回的全部是1

我的想法是获取form标记的索引,然后在表单标记本身中添加字符数,然后在此之后插入我的字符串。但由于某种原因,我无法找到最后一个字符的索引或MatchData的长度。

我哪里误入歧途?

2 个答案:

答案 0 :(得分:2)

试试这个,

last_index = str.index(/\<form.*\>/) + str[/\<form.*\>/].size

这是如何运作的?

  • str.index返回正则表达式的起始索引
  • str.[...]返回匹配本身
  • size获取比赛的长度

然而,

看起来你正在操纵一个html字符串。最好使用nokogiri宝石

require 'nokogiri'

doc = Nokogiri::HTML(str)
form = doc.at('form')
form.inner_html = '<div>new content</div>' + form.inner_html 
puts doc 

这会在form代码中添加新内容。

答案 1 :(得分:0)

您可以按如下方式插入字符串。

def insert_str(str, regex, insert_str)
  idx = str.match(regex).end(0)
  return nil if idx.nil?
  str[0,idx]+insert_str+str[idx..-1]
end

str = '<form action="/cart" method="post" novalidate class="cart-wrapper">'
  #=> "<form action=\"/cart\" method=\"post\" novalidate class=\"cart-wrapper\">" 
insert_str(str, /\<form.*\>/, "cat")           
  #=> "<form action=\"/cart\" method=\"post\" novalidate class=\"cart-wrapper\">cat"
str
  #=> "<form action=\"/cart\" method=\"post\" novalidate class=\"cart-wrapper\">"

insert_str("How now, brown cow?", /\bbrown\b/, " or blue")
  #=> "How now, brown or blue cow?" 

MatchData#end。如果您想改变str,请按如下方式修改方法。

def insert_str(str, regex, insert_str)
  idx = str.match(regex).end(0)
  return nil if idx.nil?
  str.insert(idx, insert_str)
end

str = '<form action="/cart" method="post" novalidate class="cart-wrapper">'
insert_str(str, /\<form.*\>/, "cat")           
  #=> "<form action=\"/cart\" method=\"post\" novalidate class=\"cart-wrapper\">cat"
str
  #=> "<form action=\"/cart\" method=\"post\" novalidate class=\"cart-wrapper\">cat"