匹配的Ruby正则表达式的长度

时间:2011-09-17 19:29:57

标签: ruby regex

“abc def”应匹配以下正则表达式,因为“abc”和“def”都有3个字符

/([a-z]*) ([a-z]*){\1.length}/

有没有办法在Ruby中做到这一点?

4 个答案:

答案 0 :(得分:1)

您描述的字符串集不构成常规语言。它不能与正则表达式匹配。它是无法与正则表达式匹配的经典语言示例之一(另一种是测试匹配的括号)。

只需比较普通代码中两个字符串的长度。

答案 1 :(得分:1)

不,不单独使用正则表达式。部分:{\1.length}无效,至少,不是因为您希望使用它。

尝试这样的事情:

#!/usr/bin/env ruby
if /([a-z]+)\s+([a-z]+)/ =~ 'abc def' and $1.length == $2.length
  print 'OK'
else
  print 'No match...'
end

答案 2 :(得分:1)

def match_equal_length(s, regex)
  m = s.scan(r)
  return m[0] if (m.size > 0) && (m[0][0].size == m[0][1].size)
  nil # String doesn't match or $1.size != $2.size
end

答案 3 :(得分:1)

我不认为你可以在正则表达式中做到这一点,但是你可以通过使用match的块来完全接近:

two_same_length = s.match(/([a-z]*) ([a-z]*)/) { |m| m[1].length == m[2].length }

整个匹配位于m[0] in the block,您希望查看这些群组,以便m[1]m[2]。如果你总是想要一个布尔值(而不是nil如果根本没有匹配的话)那么双击它:

two_same_length = !!s.match(/([a-z]*) ([a-z]*)/) { |m| m[1].length == m[2].length }

例如:

>> !!'abc pancakes'.match(/([a-z]*) ([a-z]*)/) { |m| m[1].length == m[2].length }
=> false
>> !!'pancakes'.match(/([a-z]*) ([a-z]*)/) { |m| m[1].length == m[2].length }
=> false
>> !!'whereis pancake'.match(/([a-z]*) ([a-z]*)/) { |m| m[1].length == m[2].length }
=> true