# This module add a String refinement to enable multiple String#match()s
# 1. `String#scan` only get what is inside the capture groups (inside the parens)
# 2. `String#match` only get the first match
# 3. `String#matches` (proposed function) get all the matches
module StringMatches
refine String do
def matches(regex)
scan(/(?<matching>#{regex})/).flatten
end
end
end
6条答案
按热度按时间wvt8vs2t1#
使用
scan
应该可以做到这一点:jtw3ybtb2#
若要查找所有匹配的字符串,请使用String的
scan
方法。如果您需要
MatchData
(Regexpmatch
方法传回的对象型别),请用途:使用
MatchData
的好处是,您可以使用类似于offset
的方法:如果您想了解更多信息,请参阅以下问题:
阅读Ruby中的特殊变量
$&
,$'
,$1
,$2
也会有所帮助。6vl6ewon3#
如果您有一个包含组的正则表达式:
您可以使用String的
scan
方法来查找匹配的组:要查找匹配模式:
bejyjqdl4#
你可以使用
string.scan(your_regex).flatten
。如果你的正则表达式包含组,它将在一个普通数组中返回。Regex也可以是一个命名组。
您也可以使用
gsub
,如果您需要MatchData,这只是另一种方法。euoag5mw5#
如果在正则表达式中有用于其他目的的捕获组
()
,则建议的String#scan
和String#match
解决方案会有问题:String#scan
只得到capture groups里面的内容;String#match
只得到第一个匹配,拒绝所有其它匹配;String#matches
(建议的函数)获取所有匹配项。在这种情况下,我们需要一个解决方案来匹配正则表达式,而不考虑捕获组。
String#matches
的名称使用Refinements,你可以猴子修补
String
类,实现String#matches
,这个方法将在使用精化的类的作用域中可用。这是一个在Ruby上猴子修补类的不可思议的方法。设置
/lib/refinements/string_matches.rb
已使用:named capture groups
用法
rails c
个7lrncoxx6#
返回
MatchData
对象的数组#scan
非常有限--只返回一个简单的字符串数组!对于我们来说,获取
MatchData
对象的数组要强大/灵活得多。我将提供两种方法(使用相同的逻辑),一种使用PORO,另一种使用monkey patch:
采购订单:
用途:
猴子补丁
我通常不会宽恕猴子修补,但在这种情况下:
'string'.match_all(/pattern/)
比MatchAll.new('string', /pattern/).match_all
更直观(而且看起来更漂亮我建议创建一个新文件,并将补丁(假设您使用的是Rails)放在那里
/lib/ruby_core_extensions/string/match_all.rb
要使用我们的修补程序,我们需要使其可用:
然后确保将其包含在
String
类中(您可以将其放在任何需要的地方;但是,例如,就在我们上面写的require语句下面。在你include
它一次之后,它将在任何地方可用,甚至在你包含它的类之外)。用法:现在,当您使用
#match_all
时,会得到如下结果:当我想匹配多个匹配项,然后获得每个匹配项的有用信息时,我发现这一点特别有用,例如匹配项的起始和结束索引(例如
match.offset(0) => [first_index, last_index]
)