MatchData 中捕获的组的即时或隐式类型转换
Posted
技术标签:
【中文标题】MatchData 中捕获的组的即时或隐式类型转换【英文标题】:Instant or implicit type conversion for captured groups in MatchData 【发布时间】:2022-01-09 08:25:57 【问题描述】:我知道用 Ruby 的Regexp
匹配字符串本质上是呃……基于字符串的。但我之前对新颖的 Ruby 解决方案感到惊讶,我想知道是否存在适合这种情况的好的解决方案:
知道匹配组将允许将捕获的部分转换为 Integer
总是...有没有办法表达 Regexp
或 String#match
以这样的方式捕获组在 @ 987654325@瞬间转成整数?
示例:
line = "answer 42"
p line.match(/(\w+) (\d+)/).captures
返回
["answer", "42"]
我的目标是在第二组中获得转换后的数字类型,如
["answer", 42]
在Regexp
中使用命名组无关紧要:
line.match(/(?<string>\w+) (?<integer>\d+)/)
# => #<MatchData "answer 42" string:"answer" integer:"42">
如果这是不可能的——我怀疑它是——转换某些群体的优雅解决方案是什么?目前,对于一系列这样的行,我正在使用这个
lines.map |line| line.match(/(\w+) (\d+)/).captures
.map |string, integer| [string, integer.to_i]
由于String#to_i
的显式转换,它完成了这项工作。
【问题讨论】:
正则表达式只关注字符串。至于将整数的字符串表示形式转换为整数的方法,这是特定于字符串的,因此没有通用的方法。 【参考方案1】:这并不是问题的真正答案(不涉及明确的 MatchData),但它可能很有用,而且评论太长了,所以:
require 'csv'
line = "answer 42"
p CSV.parse_line(line, col_sep: " ", converters: :integer) # => ["answer", 42]
【讨论】:
创意虽然从技术上讲不会太长,但不能发表评论(即使是“评论太长”部分):) 是的,我也想过在CSV
lib 中应用解析器的转换——这也是一个解决方案。感谢您将其添加为答案(而不是评论)。以上是关于MatchData 中捕获的组的即时或隐式类型转换的主要内容,如果未能解决你的问题,请参考以下文章
Mysql 说:#1422 - 存储函数或触发器中不允许显式或隐式提交
MySQL #1422 存储函数或触发器中不允许显式或隐式提交
包含不同类型 VBA Excel 的组的每个下一个循环中的类型不匹配