【问题标题】:How to access the results of .match as string value in Crystal lang如何在 Crystal lang 中将 .match 的结果作为字符串值访问
【发布时间】:2018-07-18 00:47:52
【问题描述】:

在许多其他编程语言中,有一个函数将正则表达式作为参数并返回一个字符串值数组。 Javascript 和 Ruby 也是如此。然而,水晶中的.match 确实 1) 似乎不接受全局标志,并且 2) 它不返回数组,而是返回类型为 Regex::MatchData 的结构。 (https://crystal-lang.org/api/0.25.1/Regex/MatchData.html)

以下代码为例:

str = "Happy days"
re = /[a-z]+/i
matches = str.match(re)
puts matches

返回Regex::MatchData("Happy")

我不确定如何将此结果转换为字符串,或者为什么这不是灵感语言 (Ruby) 中的默认值。我理解这个问题可能是由于我没有处理结构和编译语言的经验,但我希望能得到一个答案,希望它也可以帮助其他有 JS/Ruby 背景的人。

【问题讨论】:

  • 您似乎想要matches.string,但使用scan,您将获得所有匹配项。

标签: regex matching crystal-lang


【解决方案1】:

如果我只想第一个匹配项转换成字符串怎么办?

puts "Happy days"[/[a-z]+/i]?
puts "Happy days".match(/[a-z]+/i).try &.[0]

它将尝试将字符串与/[a-z]+/i regex 匹配,如果匹配,则会输出第 0 组,即整个匹配项。请注意,如果找不到匹配项,[...] 之后的 ? 将使其正常失败。如果只使用puts "??!!"[/[a-z]+/i],会抛出异常。

this online demo

如果您想要类似于String#scan 的功能返回在输入中找到的所有匹配项,您可以使用(仅根据@Amadan's remark 保留的缩短版本):

matches = str.scan(re).map(&.string)

code above 的输出:

["Happy days", "Happy days"]

请注意:

【讨论】:

  • 或者更简单,matches = str.scan(re).map(&.string)
  • @Amadan 是的,当然,我也想补充一下,但睡着了:(当时是凌晨 2:30 :)
  • 如果我只想将第一个匹配转换为字符串怎么办? puts match.string 将打印 Happy days 而我只想打印 Happy。同时puts match 产生Regex::MatchData("Happy")
  • @Shadow43375 我在答案的顶部添加了两个变体。
【解决方案2】:

实际上,发布的示例在 Ruby 中返回一个 #<MatchData "Happy">,它也没有“全局”标志 - 这就是 String#scan(Regex) 的用途,正如其他人所提到的那样。

如果你只想要一个单个匹配而不通过Regex::MatchData,你可以使用String#[](Regex)

str = "Happy days"
p str[/[a-z]+/i] # => "Happy"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多