试图将最后一次更改为" x" s为23

时间:2016-01-07 13:57:03

标签: ruby regex

我一直在玩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 每个组合的数字

有没有更简单的方法来做到这一点,我不理解?

3 个答案:

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

请参阅IDEONE demoregex demo

/xx\b/匹配任何2个x字符,后跟非字字符或字符串结尾。