“abc def”应匹配以下正则表达式,因为“abc”和“def”都有3个字符
/([a-z]*) ([a-z]*){\1.length}/
有没有办法在Ruby中做到这一点?
答案 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