【问题标题】:Why does /[<>]/ not return both angle brackets with String#match?为什么 /[<>]/ 不使用 String#match 返回两个尖括号?
【发布时间】:2015-09-30 15:12:09
【问题描述】:

我希望这个例子能匹配&lt;&gt;这两个字符:

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

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

【问题讨论】:

标签: ruby regex character-class


【解决方案1】:

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

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

【讨论】:

  • #scan 不会返回 MatchDatas。
  • @SergioTulentsev 是否​​有类似scan 的方法可以返回匹配数据?
  • 见@jrochkkind 评论,stackoverflow.com/questions/6804557/… 展示了一种将它们作为匹配数据的方法
【解决方案2】:

问题

你误解了你的表达方式。 /[&lt;&gt;]/ 表示:

匹配字符类中的单个字符,可以是&lt;&gt;

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

解决方案

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

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

或者,如果您只想匹配字符串中&lt;&gt; 的所有实例,那么您应该使用带有字符类或交替的String#scan。在这种特殊情况下,结果将是相同的。例如:

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

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

【讨论】:

  • 我认为他理解模式就好了(意思是,这不是这里的问题)
猜你喜欢
  • 2017-09-01
  • 2012-02-08
  • 2013-05-30
  • 2016-04-30
  • 1970-01-01
  • 2016-04-15
  • 2015-12-23
  • 1970-01-01
相关资源
最近更新 更多