繁体   English   中英

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

[英]Length of matched Ruby regex

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

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

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

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

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

不,不是仅使用正则表达式。 至少{\\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
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

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

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

整个匹配位于块中的m[0] ,您需要查看组,因此需要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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM