正则表达式仅匹配第一个元音并将其包含在匹配项中

时间:2018-07-08 10:10:11

标签: ruby regex

我试图在字符串中找到元音的第一个匹配项,然后在ruby中对字符串进行分区,但是我没有得到正确的结果。

我尝试过的是

UseStaticFiles()

但是我回来了"rodio".partition(/[(?=aeiouAEIOU)].*/).reject(&:empty?) 。对于我抛出的任何单词,我都会找回没有元音的部分和带有的部分,但是我需要没有元音的部分来包含它。所以应该是

["r", "odio"]

["ro", "dio"]应该是celery而不是["ce", "lery"]等。

我想念什么?我正在尝试一切,但我不知道如何编写。

4 个答案:

答案 0 :(得分:4)

您可以使用正向后视和带有split极限参数的2

.split(/(?<=[aeiou])/i, 2)

请参见online Ruby demo

(?<=[aeiou])模式是正向后看,它与紧接在aei,{{ 1}}或o(使用u修饰符启用不区分大小写的匹配)。 /i limit 参数使引擎仅将字符串分成两部分,因此在第一场比赛中只会被分割一次。

您肯定可以对2使用相同的模式:

.partition

答案 1 :(得分:4)

您无需使用任何环顾四周即可,非贪婪的量词就足够了:

"rodio".partition(/.*?[aeiou]/i).reject(&:empty?)

或者更好,使用否定的字符类:

"rodio".partition(/[^aeiou]*./i).reject(&:empty?)

答案 2 :(得分:1)

只需使用正向后看即可:"rodio".partition(/(?<=[aeiou])/i).reject(&:empty?)

答案 3 :(得分:1)

一个人可以使用String#index找到第一个元音的位置,然后找到String#[](“切片”)。

str = "their"
i = str.index /[aeiou]/i
  #=> 2
i.nil? ? str : [str[0..i], str[i+1..-1]]
  #=> ["the", "ir"]

str = "tryst"
i = str.index /[aeiou]/i
  #=> nil
i.nil? ? str : [str[0..i], str[i+1..-1]]
  #=> "tryst"