Ruby: условная замена в String с использованием gsub - PullRequest
3 голосов
/ 06 декабря 2010

С учетом входной строки:

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

Я хотел бы заменить все значения, которые не равны 1, на 5.
Таким образом, выходная строка должна выглядеть так:

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

Я пытался использовать:

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

Но это не заменит 10 и 11.

Ответы [ 3 ]

19 голосов
/ 06 декабря 2010

#gsub может принять блок и заменит его результатом:

subject.gsub(/\d+/) { |m| m == '1' ? m : '5' }
4 голосов
/ 06 декабря 2010

Без регулярного выражения только потому, что это возможно

"1 2 10 11".split.map{|n| n=='1' ? n : '5'}.join(' ')
3 голосов
/ 06 декабря 2010
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>')
...