Ruby:使用gsub在String中进行条件替换

时间:2010-12-06 14:10:05

标签: ruby regex replace conditional

给定输入字符串:

<m>1</m>
<m>2</m>
<m>10</m>
<m>11</m>

我想用1替换所有不等于5的值 因此输出String应如下所示:

<m>1</m>
<m>5</m>
<m>5</m>
<m>5</m>

我尝试使用:

gsub(/(<m>)([^1])(<\/m>)/, '\15\3')

但这不会取代1011

3 个答案:

答案 0 :(得分:19)

#gsub可以选择接受一个块,并替换为该块的结果:

subject.gsub(/\d+/) { |m| m == '1' ? m : '5' }

答案 1 :(得分:4)

没有正则表达式只是因为它可能

"1 2 10 11".split.map{|n| n=='1' ? n : '5'}.join(' ')

答案 2 :(得分:3)

result = subject.gsub(/\b(?!1\b)\d+/, '5')

<强>解释

\b    # match at a word boundary (in this case, at the start of a number)
(?!   # assert that it's not possible to match
 1    # 1
 \b   # if followed by a word boundary (= end of the number)
)     # end of lookahead assertion
\d+   # match any (integer) number

编辑:

如果您只想替换<m></m>所包围的数字,那么您可以使用

result = subject.gsub(/<m>(?!1\b)\d+<\/m>/, '<m>5</m>')