string.split(/\?|\.|!/).size 究竟是如何工作的?

How exactly does this work string.split(/\?|\.|!/).size?

我知道,或者至少我想我知道,这是做什么的 (string.split(/\?|\.|!/).size); 将每个结尾标点处的字符串拆分成一个数组,然后获取数组的大小。

我混淆的部分是(/\?|\.|!/)

感谢您的解释。

这是一个正则表达式。那个特定的匹配任何'?','。'要么 '!'在目标字符串中。

您可以在此处了解更多信息:http://regexr.com/

(/\?|\.|!/)

在外面工作:
圆括号 () 包含所有内容。
// 告诉 Ruby 你正在使用正则表达式。
\? 匹配任何 ?
\. 匹配任何 .
! 匹配任何 !
前面的 \ 告诉 Ruby 我们要在字符串中找到这些特定字符,而不是将它们用作特殊字符。

特殊字符(需要转义才能匹配)是:

. | ( ) [ ] { } + \ ^ $ * ?. 

Ruby RegEx 有一个很好的指南:
http://rubular.com/ & http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm

正则表达式用斜杠括起来/ /

问号和点前的反斜杠表示按字面意思使用这些字符(不要将它们解释为特殊说明)

垂直管道是"or"

所以你有 / 然后问号 \? 然后 "or" | 然后句号 \. 然后 "or" |然后感叹号 ! 然后 / 结束表达式。

/\?|\.|!/

在字符 "a" 上拆分的正则表达式如下所示:/a/。在 "a" 或 "b" 上拆分的正则表达式如下所示:/a|b/。所以分裂“?”,“!”和 ”。”看起来像 /?|!|./ - 但事实并非如此。不幸的是,“?”和“。”在这种情况下我们不希望在正则表达式中具有特殊含义,因此必须使用“\”对它们进行转义。

避免这种情况的一种方法是使用 Regexp.union("?","!","."),这会导致 /\?|!|\./

对于涉及正则表达式的 SO 答案,我经常使用 "extended" 模式,这使它们可以自我记录。这个应该是:

r = /
    \? # match a question mark
    |  # or
    \. # match a period
    |  # or
    !  # match an explamation mark
    /x # extended mode

str = "Out, damn'd spot! out, I say!—One; two: why, then 'tis time to " +
      "do't.—Hell is murky.—Fie, my lord, fie, a soldier, and afeard?" 

str.split(r)
  #=> ["Out, damn'd spot",
  #    " out, I say",
  #    "—One; two: why, then 'tis time to do't",
  #    "—Hell is murky",
  #    "—Fie, my lord, fie, a soldier, and afeard"] 
str.split(r).size #=> 5

@steenslag 提到 Regexp::union. You could also use Regexp::new 写(带单引号):

r = Regexp.new('\?|\.|!')
  #=> /\?|\.|!/

但这里真的买不到任何东西。但是,您可能会发现它在其他情况下很有用。