Ruby中的RegEx:只有一场比赛?

时间:2009-01-27 15:54:23

标签: ruby regex

我正在试图弄清楚如何检查字符串是否与正则表达式匹配,但我想知道整个字符串是否只匹配一次。这是我的代码,但似乎很荒谬

def single_match(test_me, regex)
  ret_val = false
  test = regex.match(test_me)
  if (test.length==1 && test[0].length == test_me.length)
      ret_val = true
  end
  return ret_val
end

有更简单的方法吗?

P.S。这是我真正想写的方法,因为人们似乎总是问这些天我为什么要拿枪:

def is_int(test_me)
  return single_match(test_me, /[0-9]*/)
end

修改谢谢大家。 Here's where I'm really using it,但这个正则表达式的东西总是很有趣。感谢伟大而有教育意义的答案。

4 个答案:

答案 0 :(得分:7)

您不需要这样做,可以使用/^[0-9]*$/的正则表达式替换您的方法。 ^告诉它匹配行的开头,$告诉它匹配行的结尾。因此它将匹配:行的开始,0到0到9范围内的任何一个,最后是行尾。

def is_int(test_me)
  test_me =~ /^[0-9]*$/
end

并且您不需要return语句,Ruby会隐式返回最后一个语句。

修改

使用to_i类的String实例方法可能更容易,看起来更好。

def is_int(test_me)
  test_me.to_i.to_s == test_me
end

编辑:(做了一些测试)

比较两种方法之间的性能表明.to_i.to_s ==方式的速度提高了5%。因此,如果您想要处理前导零,那么个人偏好将会更好看。

答案 1 :(得分:3)

做你真正想要的事情应该更简单

def is_int(test_me)
  test_me.to_i.to_s == test_me
end

答案 2 :(得分:2)

此?

def single_match(str, regex)
  str.match(regex).to_s == str
end

答案 3 :(得分:1)

要回答原始问题,为了让人们在搜索中找到此页面,“扫描”将返回一系列匹配项,因此如果您想了解某些正则表达式匹配的次数,例如你可以做多少次数字运行:

mystring.scan(/\d+/).size