正则表达式总是给我带来麻烦。我希望能够做到以下几点:
[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
我该怎么做?我认为$只检查最后一个字符,但我需要检查有多个满足条件的最后一个字符的情况。感谢任何帮助;正则表达式总是让我适应。
理想情况下,我想要一个可以执行的正则表达式:
>["bxy-123___","bab_456-_.","abc__34--"].map { |frag| frag.gsub(???,'') }
=>["bxy-123","bab_456","abc__34"]
答案 0 :(得分:1)
使用此正则表达式:
[^a-zA-Z0-9](?=[^a-zA-Z0-9]*$)
前瞻说明如果在当前位置之后还有更多字符(即,在当前位置和字符串结尾之间),它们都不是字母或数字。但它只会在gsub
的每次迭代中替换一个字符,因此每个-
都会替换为一个x
。
答案 1 :(得分:0)
答案 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