检查模式字符串的方法的正确语法是什么,如果正则表达式匹配,则返回true或false?
基本理念:
def has_regex?(string)
pattern = /something/i
return string =~ pattern
end
用例:
if has_regex?("something")
# woohoo
else
# nothing found: panic!
end
答案 0 :(得分:43)
在你提出的问题中:
...检查字符串格式的方法,如果正则表达式匹配则返回true或false
如johannes指出,String=~
如果模式不匹配,则返回nil
,否则返回匹配单词的字符串中的位置。此外,他在Ruby中说明除nil
和false
之外的所有内容都与 true
相似。所有这些都是对的。
但是,它们不是完全 true
或false
。因此,最后一步是将值强制为Boolean
。这是通过将结果包装成双重刘海返回true
来实现的。
def has_regex?(string)
!!(string =~ /something/i)
end
答案 1 :(得分:15)
你的代码看起来不错,但你可以写得更小。
String#=~
的返回值表现如下:
nil
如果模式不匹配在Ruby中,除nil
和false
之外的所有内容都与条件语句中的true
相似,因此您只需编写
if string=~ pattern
# do something
else
# panic
end
答案 2 :(得分:11)
使其返回true / false切换模式和字符串的位置并使用大小写相等===
def has_regex?(string)
pattern = /something/i
return pattern === string
end
我绝对需要它来返回真正的布尔值并挖掘。 它实际上记录在regexp类http://www.ruby-doc.org/core-2.1.3/Regexp.html#method-i-3D-3D-3D
中答案 3 :(得分:5)
如果您使用的是Ruby 2.4或更高版本,则有String#match?(regex)
和Regexp#match?(string)
方法返回布尔值而没有转换恶作剧(通常不需要),并且具有更高的启动性能。
https://ruby-doc.org/core-2.4.0/Regexp.html#method-i-match-3F
答案 4 :(得分:5)
对于Ruby> = 2.4或Rails,您可以这样做:
regexp.match?(string)
答案 5 :(得分:2)
将它添加到String类使得它非常简单:
class String
def match?(regex)
!!self.match(regex)
end
end
我将它添加到Rails初始化程序(RAILS_ROOT / config / initializers),您可以直接从字符串中调用:
"Something special!".match?(/something/i) #=> true
"Somethin' special!".match?(/something/i) #=> false
答案 6 :(得分:1)
对于任何人未来的参考,双重刘海都不受bbatsov's ruby style guide的影响。不要使用双重爆炸,只需检查值是否为零。如果值不是,则存在。
而不是这样做:
def has_regex?(string)
!!(string =~ /something/i)
end
您可以随时执行此操作:
def has_regex?(string)
!(string =~ /something/i).nil?
end
答案 7 :(得分:1)
我没有足够的声誉来发表评论,所以我会回答。
the Ruby Style Guide中建议不要使用viljar建议的===,这会导致Rubocop投诉(根据默认规则)。
我发现最容易理解的方式是:
def match?(string)
!(string =~ /something/i).nil?
end
答案 8 :(得分:0)
由于我希望这一般工作,而不仅仅是针对任何特定项目,我根本不想修改环境。
我能够通过简单地使用普通match
方法的返回值作为条件来使其工作。测试了此示例字符串的正面和负面情况:
irb(main):014:0> if "123".match(/.2./); puts "worked"; end
worked
=> nil
irb(main):015:0> if "123".match(/.3./); puts "worked"; end
=> nil
答案 9 :(得分:-1)
如果你想把模式放在一个方法中,你可以做到
def has_my_pattern(st)
st =~ /pattern/
end
或者,或许更好,将模式放在类变量中?