簡體   English   中英

ruby regex掃描和gsub與塊中的捕獲組的工作方式不同

[英]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-methodhttp://ruby-doc.org/core-2.2.2/String.html#scan-method

簡而言之,掃描更多的是在字符串/表達式中查找模式(並使用一個塊,以某種方式對其進行格式化),而gsub的更多內容是對字符串中的模式進行替換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM