-1

我希望这个例子能匹配两个字符<>

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

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

4

2 回答 2

2

#match只返回第一个匹配项,正如您所看到的 MatchData, #scan将返回所有匹配项。

>> a="<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>"
=> "<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>"
>> a.scan /[<>]/
=> ["<", ">"]
于 2015-09-30T15:19:00.623 回答
1

问题

你误解了你的表达方式。/[<>]/方法:

匹配字符类中的单个字符,可以是<>

Ruby 正确地为您提供了您在模式中所要求的内容。

解决方案

如果您期望两个字符之间的整个字符串,则需要不同的模式。例如:

"<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>".match /<.*?>/
#=> #<MatchData "<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>">

或者,如果您只想匹配字符串<>字符串中的所有实例,则应将String#scan与字符类或替代一起使用。在这种特殊情况下,结果将是相同的。例如:

"<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>".scan /<|>/
#=> ["<", ">"]

"<1acf457f477b41d4a363e89a1d0a6e57@Open-Xchange>".scan /[<>]/
#=> ["<", ">"]
于 2015-09-30T15:31:30.447 回答