【问题标题】:Regex question: What is the difference between /.../ and /(...)/?正则表达式问题:/.../ 和 /(...)/ 有什么区别?
【发布时间】:2021-07-14 06:17:19
【问题描述】:

查看下面的代码(在 Ruby 中),为什么第一个实例在从字符串形成数组时拒绝空格,而在第二个实例中保留空格?基本上,我在问 /.../ 和 /(...)/ 在正则表达式中的区别。

str = 'The quick brown fox jumps over the lazy dog.'

print str.split(/\s+/)
#["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]

print str.split(/(\s+)/)
#["The", " ", "quick", " ", "brown", " ", "fox", " ", "jumps", " ", "over", " ", "the", " ", "lazy", " ", "dog."]

【问题讨论】:

  • 你的两个拆分调用是相同的。
  • 您在两种情况下都粘贴了完全相同的print 命令。请向我们展示真实代码。

标签: regex ruby


【解决方案1】:

通常,正则表达式部分周围的括号会捕获与该部分正则表达式匹配的文本部分,以便稍后在正则表达式或匹配后的代码中使用。

示例:"foofoo".match(/(.*)\1/) 为真,因为它包含重复的字符串; \1 的意思是“与该模式的第一组括号之间的部分匹配的任何内容”。在这种情况下,括号之间的.* 匹配“foo”,\1 匹配“foo”的第二个副本。

split 不同;它匹配很多次,并且没有任何地方可以放置括号组捕获的文本。因此,括号告诉它在结果数组中保留分隔符。这样,如果被拆分的正则表达式可以匹配多个字符,您就可以找出每个位置中的哪个字符。

 # no capture, nothing kept; nothing in the array to tell - from ,
 '1-2,3'.split(/[-,]/) #=> ["1", "2", "3"]

 # with capture, include delimiters; now array tells me which separators used
'1-2,3'.split(/([-,])/) #["1", "-", "2", ",", "3"]

这是从 Perl,FWIW 继承的另一个行为示例。

【讨论】:

    【解决方案2】:

    我认为您想解释以下之间的区别:

    print str.split(/\s+/)    # split on whitespace and consume it
    print str.split(/(\s+)/)  # split on whitespace and capture it
    

    在第一种情况下,我们在空格上进行拆分,这些空格字符被消耗,这意味着它们不会出现在输出数组中。这仅留下非空白词。另一方面,在第二个版本中,我们使用(\s+) 将拆分空白作为捕获组。结果,这些捕获的空白字符会进入输出。结果,我们将所有非空白组和空白组视为输出数组中单独的有序条目。

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2013-11-09
      • 2013-10-07
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多