给定输入字符串:
<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')
但这不会取代10
和11
。
答案 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>')