MatchData 中捕获的组的即时或隐式类型转换

Posted

技术标签:

【中文标题】MatchData 中捕获的组的即时或隐式类型转换【英文标题】:Instant or implicit type conversion for captured groups in MatchData 【发布时间】:2022-01-09 08:25:57 【问题描述】:

我知道用 Ruby 的Regexp 匹配字符串本质上是呃……基于字符串的。但我之前对新颖的 Ruby 解决方案感到惊讶,我想知道是否存在适合这种情况的好的解决方案:

知道匹配组将允许将捕获的部分转换为 Integer 总是...有没有办法表达 RegexpString#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 的组的每个下一个循环中的类型不匹配

如何在 ASP.NET 响应中将 Transfer-Encoding 设置为显式或隐式分块?

是否可以在一行中检测捕获组的组合和排列?