我希望此示例匹配两个字符<
和>
:
a = "<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>"
a.match /[<>]/
# => #<MatchData "<">
它仅匹配第一个字符。为什么呢?
答案 0 :(得分:2)
#match
仅返回第一个匹配,因为您看到MatchData,#scan
将返回所有匹配项。
>> a="<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>"
=> "<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>"
>> a.scan /[<>]/
=> ["<", ">"]
答案 1 :(得分:1)
你误解了你的表情。 /[<>]/
表示:
匹配字符类中的单个字符,可以是
<
或>
。
Ruby正确地向您提供了您在模式中要求的内容。
如果你期望两个字符之间的整个字符串,你需要一个不同的模式。例如:
"<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>".match /<.*?>/
#=> #<MatchData "<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>">
或者,如果您只想匹配字符串中<
或>
的所有实例,则应使用带有字符类或替换的String#scan。在这种特殊情况下,结果将是相同的。例如:
"<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>".scan /<|>/
#=> ["<", ">"]
"<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>".scan /[<>]/
#=> ["<", ">"]