此代码在第一个元音处将一个单词拆分为两个字符串。为什么呢?
word = "banana"
parts = word.split(/([aeiou].*)/)
答案 0 :(得分:5)
这里的关键是在两个/
之间使用的正则表达式(或正则表达式)
[aeiou]
说要查找其中一个字符的第一个实例。
.
匹配任何单个字符
*
将之前的内容修改为匹配0或更多
(...)
表示捕获括号之间的所有内容
翻译成英文这个正则表达式可能会读取类似“给定一个字符串,找到第一个元音后跟零个或多个字符。收集该元音及其后面的字符并将它们放在一边。”
更令人困惑的部分是正则表达式与split
方法的交互。正则表达式返回的值是'anana'。我们可以看到用'anana'调用split并不会产生相同的结果:
'banana'.split('anana') #=> ["b"]
但是当使用使用捕获组的正则表达式(或括号(...)
)调用split时,该拆分组中的任何内容也将在拆分结果中返回。这就是原因:
'banana'.split /([aeiou].*)/ #=> ["b", "anana"]
如果你想了解更多关于正则表达式如何工作的信息(特别是在ruby中),Rubular是一个很好的资源 - http://www.rubular.com/r/XEUgPhOdlH
答案 1 :(得分:2)
这实际上有点棘手。这个正则表达式
/[aeiou].*/
匹配从第一个元音到字符串结尾的字符串,即" anana"。但是,如果你要分开,你只会得到第一个字母,因为split
没有包含分裂模式:
"banana".split /[aeiou].*/
# ["b"]
但是根据String#split
文档,如果分割模式是带有捕获组的正则表达式,则捕获组也包含在结果中。由于整个模式都包含在捕获组中,结果是字符串在第一个元音之前分裂。
例如,如果将正则表达式更改为具有两个捕获组,则会进一步拆分:
"banana".split /([aeiou])(.*)/
# ["b", "a", "nana"]
答案 2 :(得分:1)
回答老标题
它不是Ruby的语法,它是由Ruby实现的标准Regular Expression语法。
*
表示上一个项目中的零个或多个.
表示任何字符[aeiou]
表示大括号内的任何字符()
表示捕获它因此,正则表达式意味着:捕获以a
,e
,i
,o
或u
开头的所有内容。
word.split(/([aeiou].*)/)
表示根据以字母word
,a
,e
,i
开头的任何内容拆分o
变量,或u
。
请参见前面的more信息。
新标题的答案
为什么它会在第一个元音上分裂?这不是真的那样..它的作用是,由任何以元音开头并捕获它的元素(以元音开头的字符串)分开,也请看这里的更多例子:
word = 'banana'
word.split /[aeiou]/ # split by vowels
#=> ["b", "n", "n"]
word.split /([aeiou])/ # split by vowels and capture the vowels
#=> ["b", "a", "n", "a", "n", "a"]
word.split /[aeiou].*/ # split by anything that start with vowels
#=> ["b"]
word.split /([aeiou].*)/ # split by anything that start with vowels and capture the thing that start with vowels also
#=> ["b", "anana"]
回答老标题
如果*
符号不在正则表达式//
中(Ruby的语法),则有一些可能性:
2 * 3 == 6
,'na' * 3 == 'nanana' # batman!
[*(1..4)] == [1,2,3,4]
,请参阅更多信息here