为什么/ [<>] /不会返回两个尖括号与String#match?

时间:2015-09-30 15:12:10

标签: ruby regex character-class

我希望此示例匹配两个字符<>

a = "<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>"
a.match /[<>]/
# => #<MatchData "<">

它仅匹配第一个字符。为什么呢?

2 个答案:

答案 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 /[<>]/
#=> ["<", ">"]