正则表达式中的重复和字符类

时间:2014-08-15 00:00:45

标签: ruby regex

您可以使用字符类来匹配一系列字符,而不是像这样的完全匹配:

> 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”这样的结果。为什么这不起作用?

2 个答案:

答案 0 :(得分:1)

每个匹配都是一个离散的匹配 - 它不会将结果粘合在一起。

要获得所有结果,请使用str.scan()

> str = "Daaniaal"
> str.scan /a+/
=> ["aa", "aa"]

答案 1 :(得分:0)

它必须是连续的。所以它必须匹配&#39; aaniaa&#39;。但当然它只匹配字母&#39; a&#39;。

第二个&#39; aa&#39;当然是一种不同的有效匹配。

String::scan会给你多个结果。