6

有没有更好的方法在 Ruby 中编写以下正则表达式?第一个正则表达式匹配以(小写)辅音开头的字符串,第二个以元音开头。

我试图弄清楚是否有一种方法可以编写与第二个表达式的否定匹配的正则表达式,而不是编写具有多个范围的第一个表达式。

string =~ /\A[b-df-hj-np-tv-z]/
string =~ /\A[aeiou]/
4

4 回答 4

12

该声明

$string =~ /\A[^aeiou]/

将测试字符串是否以非元音字符开头,包括数字、标点符号、空格和控制字符。如果您事先知道字符串以字母开头,那很好,但是要检查它是否以辅音开头,您可以使用前瞻来测试它是否以字母和非元音开头,就像这样

$string =~ /\A(?=[^aeiou])(?=[a-z])/i

要匹配任意数量的辅音,您可以使用子表达式(?i:(?![aeiou])[a-z])来匹配辅音。它是原子的,所以你可以{3}在它后面加上一个重复计数。例如,此程序查找列表中连续包含三个辅音的所有字符串

list = %w/ aab bybt xeix axei AAsE SAEE eAAs xxsa Xxsr /

puts list.select { |word| word =~ /\A(?i:(?![aeiou])[a-z]){3}/ }

输出

bybt
xxsa
Xxsr
于 2013-08-23T15:55:54.563 回答
4

我修改了@Alexander Cherednichenko 提供的答案,以摆脱 if 语句。

/^[^aeiou\W]/i.match(s) != nil
于 2017-04-23T09:41:12.463 回答
2

如果你想捕捉一个不以元音开头但只以辅音开头的字符串,你可以使用下面的代码。如果字符串以 A、E、I、O、U 以外的任何字母开头,则返回 true。s是我们给函数的任何字符串

  if /^[^aeiou\W]/i.match(s) == nil
    return false
  else
    return true
  end

在最后添加了使正则表达式不区分大小写。

\W用于捕获任何非单词字符,例如,如果字符串以数字开头,例如:“1something”

[^aeiou]表示aeiou以外的字符范围

而我们把^放在[前面的开头,表示后面的范围[^aeiou\W] if为第一个字符

于 2016-11-11T13:10:58.457 回答
0

请注意,^[^aeiou\W]模式不正确,因为它还匹配以数字或下划线开头的行Borodin的解决方案运行良好,但还有另一种可能的解决方案,无需前瞻,基于字符类减法更多here)并使用更现代的Regexp#match?

/\A[a-z&&[^aeiou]]/i.match?(word)

请参阅Rubular 演示

细节

  • \A- 字符串的开头(^在 Ruby 中是任何行的开头)
  • [a-z&&[^aeiou]]-a-z匹配任何 ASCII 字母的字符范围(/i标志使其不区分大小写),字符除外。aeiou

请参阅Ruby 演示

test = %w/ 1word _word ball area programming /
puts test.select { |w| /\A[a-z&&[^aeiou]]/i.match?(w) }
# => ['ball', 'programming']
于 2021-09-23T19:04:10.190 回答