您可以使用字符类来匹配一系列字符,而不是像这样的完全匹配:
> str = "Daniel"
> match = /A-Za-z/.match str
=> nil
> match = /[A-Za-z]/.match str
=> #<MatchData "D">
第一个示例返回nil,因为“Daniel”与“A-Za-z”不完全匹配。但是第二个例子使用了一个字符类,其中' - '在与范围匹配时具有特殊含义。因此,正则表达式引擎检查字符串并在第一次出现匹配时停止,在这种情况下为“D”。
由于+修饰符匹配一个或多个出现,我可以这样返回完整的字符串:
> match = /[A-Za-z]+/.match str
=> #<MatchData "Daniel">
match [0]将提供完整的字符串“Daniel”,因为正则表达式匹配了字母表中基本上每个字母的一个或多个出现。
有了这些知识,那么引擎也应该能够匹配字符串中的所有a。但事实并非如此:
> str = "Daaniaal"
> match = /[a]+/.match str
=> #<MatchData "aa">
它似乎在匹配前两个a后停止,即使我使用+修饰符来匹配一个或多个出现。本来可以期待像“aaaa”这样的结果。为什么这不起作用?
答案 0 :(得分:1)
每个匹配都是一个离散的匹配 - 它不会将结果粘合在一起。
要获得所有结果,请使用str.scan()
。
> str = "Daaniaal"
> str.scan /a+/
=> ["aa", "aa"]
答案 1 :(得分:0)
它必须是连续的。所以它必须匹配&#39; aaniaa&#39;。但当然它只匹配字母&#39; a&#39;。
第二个&#39; aa&#39;当然是一种不同的有效匹配。
String::scan
会给你多个结果。