我一直在玩IRB
,并且有一个如下所示的字符串:
irb(main):072:0> puts a
["[\"4354 5432 5432 xxxxx\", \"6547 6547 8543 xxxxx\", \"2344 6543 6674 xxxxx\", \"2346 6236 7543 xxxxx\", \"1273 5585 5587 xxxxx\"]"]
=> nil
irb(main):073:0>
我想要做的是gsub
每个 17位组合的最后两个"x"
,23
。
我尝试过的事情(我一直在使用Rubular):
a.gsub(/\D[x]/,"23")
< =抓住所有"x"
s,以便我关闭a.gsub(/\w[x{2}]/,"23")
< =抓住所有"x"
,但也抓住 2
每个组合的数字。有没有更简单的方法来做到这一点,我不理解?
答案 0 :(得分:2)
a.gsub(/\d{4} \d{4} \d{4} xxx\Kxx/, '23')
\d{4}
= 4位
{{}}}做的是删除到目前为止匹配的内容。您可以使用它,这样您就不会替换整个号码,但仍然可以验证您是否拥有所需的格式。
答案 1 :(得分:1)
虽然@ndn的解决方案很好,但这是另一种方法。该字符串看起来非常类似于json,所以:
input = "[\"4354 5432 5432 xxxxx\", \"6547 6547 8543 xxxxx\"]"
require 'json'
JSON.parse(input).map { |e| e.sub /xx\z/, '23' }.to_json
#⇒ "[\"4354 5432 5432 xxx23\", \"6547 6547 8543 xxx23\"]"
答案 2 :(得分:1)
如果您打算替换“单词”末尾的任意两个xx
,您可以使用
a.gsub(/xx\b/, '23')
# => ["4354 5432 5432 xxx23", "6547 6547 8543 xxx23"]
/xx\b/
匹配任何2个x
字符,后跟非字字符或字符串结尾。