[英]ruby regex scan and gsub work differently with capture groups in blocks
我有一串交替的數字和字母。 我想用前面的字母數替換每個字符。 例如, 2a3b
應該返回aabbb
。
首先,如果我這樣做:
"2a3b".scan(/(\d)(.)/) do |count, char|
puts char * count.to_i
end
我得到:
aa
bbb
但是,如果我這樣做:
"2a3b".gsub(/(\d)(.)/) do |count, char|
char * count.to_i
end
我收到一個錯誤:
NoMethodError: undefined method `*' for nil:NilClass
它們的行為不應該一樣嗎(更新:我的意思是,接受捕獲組作為塊參數)?
更新 :(替代方法,可行)
"2a3b".gsub(/(\d)(.)/) do |match|
$2 * $1.to_i
end
收益:
"aabbb"
如預期的那樣。
不,他們的行為不同。 gsub的塊形式僅接受一個參數,因此第二個參數將為nil,因此會出現錯誤。 參見http://ruby-doc.org/core-2.1.4/String.html#method-i-gsub
使用示例: "hello".gsub(/./) {|s| s.ord.to_s + ' '}
"hello".gsub(/./) {|s| s.ord.to_s + ' '}
在塊形式中,當前的匹配字符串作為參數傳遞,並且諸如$ 1,$ 2,$`,$&和$'之類的變量將被適當地設置。 該塊返回的值將代替每次調用的匹配項。
結果將繼承原始字符串或任何提供的替換字符串中的任何污點。
不,它們是兩種不同的方法,它們執行不同的操作。
參見http://ruby-doc.org/core-2.2.2/String.html#gsub-method和http://ruby-doc.org/core-2.2.2/String.html#scan-method
簡而言之,掃描更多的是在字符串/表達式中查找模式(並使用一個塊,以某種方式對其進行格式化),而gsub的更多內容是對字符串中的模式進行替換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.