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

Posted

技术标签:

【中文标题】正则表达式中的重复和字符类【英文标题】:repetition and character classes in regular expression [duplicate] 【发布时间】:2014-10-08 18:37:15 【问题描述】:

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

> 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”这样的结果。这怎么行不通?

【问题讨论】:

【参考方案1】:

它必须是连续的,所以它必须匹配“aaniaa”,但当然它只匹配字母“a”。第二个“aa”是不同的有效匹配。

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

match = /[A-Za-z]+/.match str 在每次出现时都会产生离散匹配,并将结果粘合在一起。 @JohnMerlino 它没有,它只是匹配字符串中的所有字符。字符串中有两种不同的模式与您的模式相匹配。 引擎一直是这样工作的,找到第一个模式后就停止了? @JohnMerlino 正确,当您使用 match 时。请注意,您可以在字符串中指定一个位置来开始搜索:ruby-doc.org/core-2.1.2/Regexp.html#method-i-match 我只是想再添加一条评论。你说过,只要正则表达式引擎找到它的第一个匹配项,它就不会继续。但是,如果我们有以下字符串: str = "月亮是由奶酪制成的"。我们在上面运行这个正则表达式:match = /\s.+\s/.match str。它返回“moon is made of”而不是“The moon is made of cheese”。就好像正则表达式引擎知道模式中的第二个 \s ,即使它永远不会到达它,因为 .+ 在我们换行之前将是真实的。

以上是关于正则表达式中的重复和字符类的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式小结

Oracle正则表达式

Java - 在正则表达式中转义元字符 [ 和 ] [重复]

正则表达式简要

JavaScript正则表达式,这一篇足矣

.NET中具有重复字符和长度的正则表达式