【问题标题】: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”这样的结果。这怎么行不通?

【问题讨论】:

    标签: ruby regex


    【解决方案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 ,即使它永远不会到达它,因为 .+ 在我们换行之前将是真实的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      相关资源
      最近更新 更多