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

EvanYa · 2017年01月05日 · 最后由 EvanYa 回复于 2017年01月09日 · 2172 次阅读

在 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]/

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

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

z 就是 z 这个 Character

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

&& 运算符的两部分是:

  1. [a-w]
  2. [^c-g]z
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]

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

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

9 楼 已删除

/[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],两个集合取交集就是结果了。

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

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

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

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