如果它不适合字符类,如何调用字符串上的gsub来更改最后一组字符

时间:2014-04-29 00:33:24

标签: ruby regex

正则表达式总是给我带来麻烦。我希望能够做到以下几点:

[10] pry(main)> "a-c---".gsub(/[^a-zA-Z0-9]$/,'x')
=> "a-c--x"

所以它给了我:

=>"a-cxxx"

而不是

=> "a-c--x"  # <- it would need to know that c fits within character class

我该怎么做?我认为$只检查最后一个字符,但我需要检查有多个满足条件的最后一个字符的情况。感谢任何帮助;正则表达式总是让我适应。

编辑#1

抱歉有任何困惑 - 我不得不和工作的人一起去吃饭。我以为我会使用像chomp这样的东西,但只接受一个字符串。我想从字符串的右侧删除所有不在[a-zA-Z0-9]中的字符;不仅仅是最后一个,但可能是3或4.我编辑了递归删除,因为我认为实现将返回到第一个非出现并向右工作。

理想情况下,我想要一个可以执行的正则表达式:

>["bxy-123___","bab_456-_.","abc__34--"].map { |frag|  frag.gsub(???,'')  }
=>["bxy-123","bab_456","abc__34"]

4 个答案:

答案 0 :(得分:1)

使用此正则表达式:

[^a-zA-Z0-9](?=[^a-zA-Z0-9]*$)

前瞻说明如果在当前位置之后还有更多字符(即,在当前位置和字符串结尾之间),它们都不是字母或数字。但它只会在gsub的每次迭代中替换一个字符,因此每个-都会替换为一个x

答案 1 :(得分:0)

试试这个:

"a-c---".gsub(/(?!.*?\w-\w?)[^a-zA-Z0-9]/, 'x')  #=> "a-cxxx"

View live on Rubular

答案 2 :(得分:0)

这是一种没有环顾的方法:

"a-c---".gsub(/([^a-zA-Z0-9]+)$/, 'x'*$1.size)
  #=> "a-cxxx"

[^a-zA-Z0-9]+放入捕获组$1 => "---"。由于我们希望使用'x'替换每个字符,因此我们只需将"---"替换为:

'x'*("---").size => 'x'*3 => "xxx"

答案 3 :(得分:0)

以下是我的意思:

p "a-c---".sub(/\W*$/){ |capture| 'x'*capture.size } #=> a-cxxx