Ruby 请教一下 Ruby 正则表达式的问题

EvanYa · 发布于 2017年01月05日 · 最后由 EvanYa 回复于 2017年01月09日 · 756 次阅读
28002

在ruby的api中Regexp类提到"&&" ,它举了一个例子

/[a-w&&[^c-g]z]/  ===  /[abh-w]/
'c-g'的意思我知道,但是后面的'z'是什么意思呢?(可能我之前说的不清楚,既然# ([a-w] AND ([c-g] OR z))那么应该还能匹配'z',可是下面说和/[abh-w]/等价?这是为什么)

原文如下

If the first character of a character class is a caret () the class is inverted: it matches any character except those named.
/[^a-eg-z]/.match('f') #=> #<MatchData "f">
A character class may contain another character class. By itself this isn’t useful because [a-z[0-9]] describes the same set as [a-z0-9]. However, character classes also support the && operator which performs set intersection on its arguments. The two can be combined as follows:
/[a-w&&[^c-g]z]/ # ([a-w] AND ([^c-g] OR z))
This is equivalent to:
/[abh-w]/

麻烦各位能指教一下,谢谢.我估计大家的英文应该不错,就不翻译一遍了:)

共收到 12 条回复
15815

它的注释写得都很明白了啊

15815

z就是z这个Character

28002

#2楼 @novtopro 感谢您的回复,我想知道的是 既然注释说是([a-w] AND ([c-g] OR z)),那么为什么结果是/[abh-w]/,z哪去了?

15815

&& 运算符的两部分是:

  1. [a-w]
  2. [c-g]z
5917
list_a = ('a'..'w').to_a  # same to a-w
list_b = ('a'..'z').to_a - ('c'..'g').to_a + ['z']  # same to [^c-g]z
list_c = list_a & list_b  # same to [a-w&&[^c-g]z]

p list_c # same to [abh-w]
18898

持着怀疑的态度去读文档,看看文档是否能解疑。。。如果不能,文档有问题,自己亲手实验吧 [[a-w&&^c-g]z]这个才是a-z除了c-g和x,y 文档的/[a-w&&[^c-g]z]/是错误语法,并不包括z,当然[abh-w]这个东西不用测试,明眼看着就不包含z 请不要盲目相信文档

96

#6楼 @flemon1986 文档没问题吧?是楼主理解有误。

9楼 已删除
96

/[a-w&&[^c-g]z]/ => [a-w] && ([^c-g]z)

中间用的交集,先除掉 [c-g],然后 [abh-w]z还是[abh-w]

或者这么理解 [^c-g] 已经包含了除c-g之外的所有字符了,当然也包括z。那原正则其实就是[a-w] && [^c-g],两个集合取交集就是结果了。

28002

#5楼 @ruchee 哦,这个方式好,非常感谢

28002

#10楼 @ArieShout 原来如此,非常感谢您的帮助,我个人正则知识很一般,理解的比较片面. 请问: 对于正则表达式请问有什么书籍或是文档可以理解的清楚一些的吗?

28002

#4楼 @novtopro 感谢您的回复,是我对"&&"理解的简单了,按照集合的思想的就好说了...

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册