首页 文章

如何在Crystal lang中将.match的结果作为字符串值访问

提问于
浏览
1

在许多其他编程语言中,有一个函数将正则表达式作为参数,并返回字符串值数组 . 这适用于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背景的人 .

2 回答

  • 0

    如果我只想在第一场比赛中转换为字符串怎么办?

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

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

    this online demo .

    如果您希望功能类似于返回 all matches found in the inputString#scan ,您可以使用(缩写版本仅按@Amadan's remark保留):

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

    输出code above

    ["Happy days", "Happy days"]
    

    注意:

  • 3

    实际上,发布的示例在Ruby中返回一个 #<MatchData "Happy"> ,它也没有"global"标志 - 这就是其他人提到的String#scan(Regex) .

    如果您只需要一次匹配而不通过 Regex::MatchData ,则可以使用[String#](https://crystal-lang.org/api/0.25.1/String.html#%5B%5D%28regex%3ARegex%2Cgroup%29-instance-method):

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

相关问题