Ruby中的正则表达式:只有一个匹配?
我试图找出如何检查字符串是否与正则表达式匹配,但我想知道整个字符串是否只匹配一次。这是我的代码,但看起来太长了Ruby中的正则表达式:只有一个匹配?,ruby,regex,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
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
有没有更简单的方法
另外,这是我真正想写的方法,因为人们似乎总是问我为什么这些天想要枪:
def is_int(test_me)
return single_match(test_me, /[0-9]*/)
end
编辑谢谢大家,但是这个正则表达式的东西总是很有趣。谢谢你的精彩和教育性的回答。这是什么
def single_match(str, regex)
str.match(regex).to_s == str
end
不需要这样做,可以使用/^[0-9]*$/的正则表达式替换方法。^表示匹配行首,$表示匹配行尾。所以它将匹配:行的开始,0到0到9范围内的任何值,最后是行的结束
def is_int(test_me)
test_me =~ /^[0-9]*$/
end
您不需要返回语句,Ruby隐式返回最后一条语句
编辑:
使用类的实例方法可能更容易,看起来也更好
编辑:做了一些测试
比较这两种方法的性能表明.to_i.to_s==way快5%。所以,这取决于个人喜好,哪一个看起来更好,如果你想处理前导零。做你真正想做的事情应该更简单
def is_int(test_me)
test_me.to_i.to_s == test_me
end
为了回答您的原始问题,为了便于人们在搜索中查找此页面,scan将返回一个匹配数组,因此如果您想了解某些regexp匹配的次数,例如,有多少次的数字,可以执行以下操作:
mystring.scan(/\d+/).size
雷格克斯!我喜欢你的答案和扎克·兰利的答案。。。谢谢。这也将匹配空字符串。考虑/^ d+$/这可能是一件好事或坏事。因为他在他的问题中用了,所以我用了。他可能希望一个空字符串被看作是第0个数字。”塞缪尔:是的,这就是为什么我说要考虑。这是一个拷贝和粘贴,还是并行的进化?这将不会与前面的0的工作,但将与否定。1我想你可能会认为整数不应该有前导零,假设函数正试图确定它。就我而言,没有前导零是可以的,但仍然。。。我想不出来的原因是什么?奇怪…0000123.to_我给123-这对我来说很有意义。因此,当你把它变回字符串时,比较失败了我明白了,赫尔曼德。。。有趣的但正如每个人都向我指出的那样,我不应该做这样的类型转换,所以我想这很好…你会知道有多少个数字,但不知道它们是否占据了整个字符串,这是个问题,还是它的一部分。因此,将mystring设置为3332b与使用扫描正则表达式设置为3是一样的。啊,短语中的歧义整个字符串只匹配一次:字符串中的任何地方只有一个匹配,而字符串是完全匹配的…谢谢Glenn,我从未被告知您的评论,非常好的一点。
mystring.scan(/\d+/).size