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('\?|\.|!')
#=> /\?|\.|!/
但这里真的买不到任何东西。但是,您可能会发现它在其他情况下很有用。
我知道,或者至少我想我知道,这是做什么的 (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('\?|\.|!')
#=> /\?|\.|!/
但这里真的买不到任何东西。但是,您可能会发现它在其他情况下很有用。