这个正则表达式如何在第一个元音上分裂?

时间:2015-01-30 02:49:13

标签: ruby regex

此代码在第一个元音处将一个单词拆分为两个字符串。为什么呢?

word = "banana"
parts = word.split(/([aeiou].*)/)

3 个答案:

答案 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]表示大括号内的任何字符
  • ()表示捕获它

因此,正则表达式意味着:捕获以aeiou开头的所有内容。

word.split(/([aeiou].*)/)表示根据以字母wordaei开头的任何内容拆分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!
  • splat operation [*(1..4)] == [1,2,3,4],请参阅更多信息here