我正在阅读关于Ruby的介绍书,我无法理解正则表达式是如何工作的。有一个例子说写一个匹配以下字符串的正则表达式:
1)rby
2)rb
我能得到的最接近的是:
rb+y*
如何编辑表达式以使其匹配?不幸的是,我正在使用的书没有提供答案。
答案 0 :(得分:3)
您可以检查字符串的开头和结尾
^rb+y*$
答案 1 :(得分:2)
字符串必须以一个“r”开头,所以我们从
开始/\Ar
\A
是一个字符串开头的锚点。接下来,有一两个"b"
。
/\Arb{1,2}
这可以选择性地跟随一个"y"
。
/\Arb{1,2}y?
最后,没有其他字符可以跟随可选的"y"
,因此我们添加了一个字符串结束锚并终止了正则表达式。
r = /\Arb{1,2}y?\z/
%w| rby rb rbby rbb |.all? { |s| s =~ r } #=> true
%w| ruby rbyry rrby bby |.any? { |s| s =~ r } #=> false
r
并不是唯一有效的正则表达式。 /\Arb+y?\z/
和/\Arb+y*\z/
也符合测试标准。
小点:\A
和\z
分别是 string 和 string 的开头,而{ {1}}和^
是行的开头和行的结尾。这里每个字符串由一行组成,因此可以使用任何一组锚点。虽然你经常会看到用于单行字符串的行尾锚点,但我相信大多数Rubiests认为你的代码是通过使用字符串结尾锚定时更清晰的,无论是否是你要锚定的字符串,无论是否是由一行或多行组成。
答案 2 :(得分:1)
您只需要匹配字符串/行的开头和结尾:
/^rb+y?$/
您可以test this and play with it here使用Rubular。
你正在阅读的书应该拼出这两个字符,但如果没有:
^
与行的开头匹配。表达式中的其他任何位置都表现不同。$
匹配行的结尾。同样,表达式中的任何其他位置都表现不同。